(a(),u("div",qa,[v("div",{ref_key:"tablist",ref:r,class:"plugin-tabs--tab-list",role:"tablist",onKeydown:b},[(a(!0),u(M,null,H(i(t),S=>(a(),u("button",{id:`tab-${S}-${i(L)}`,ref_for:!0,ref_key:"buttonRefs",ref:p,key:S,role:"tab",class:"plugin-tabs--tab","aria-selected":S===i(s),"aria-controls":`panel-${S}-${i(L)}`,tabindex:S===i(s)?0:-1,onClick:()=>i(d)(S)},w(S),9,Ja))),128))],544),c(_.$slots,"default")]))}}),Xa=["id","aria-labelledby"],Qa=m({__name:"PluginTabsTab",props:{label:{}},setup(o){const{uid:e,selected:t}=Wa();return(s,n)=>i(t)===s.label?(a(),u("div",{key:0,id:`panel-${s.label}-${i(e)}`,class:"plugin-tabs--content",role:"tabpanel",tabindex:"0","aria-labelledby":`tab-${s.label}-${i(e)}`},[c(s.$slots,"default",{},void 0,!0)],8,Xa)):h("",!0)}}),Za=$(Qa,[["__scopeId","data-v-9b0d03d2"]]),xa=o=>{Ga(o),o.component("PluginTabs",Ya),o.component("PluginTabsTab",Za)},tr={extends:Se,Layout(){return nt(Se.Layout,null,{})},enhanceApp({app:o,router:e,siteData:t}){xa(o)}};export{tr as R,go as c,V as u};
diff --git a/previews/PR126/assets/cssxjov.CGB02zQg.png b/previews/PR126/assets/cssxjov.CGB02zQg.png
new file mode 100644
index 00000000..e39a7257
Binary files /dev/null and b/previews/PR126/assets/cssxjov.CGB02zQg.png differ
diff --git a/previews/PR126/assets/cuibxhd.BxypEGK2.png b/previews/PR126/assets/cuibxhd.BxypEGK2.png
new file mode 100644
index 00000000..dbc4a6d4
Binary files /dev/null and b/previews/PR126/assets/cuibxhd.BxypEGK2.png differ
diff --git a/previews/PR126/assets/examples_generated_Actuator2D.md.CjJk3Yks.js b/previews/PR126/assets/examples_generated_Actuator2D.md.CjJk3Yks.js
new file mode 100644
index 00000000..450aeea2
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_Actuator2D.md.CjJk3Yks.js
@@ -0,0 +1,131 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const k="/IncompressibleNavierStokes.jl/previews/PR126/assets/ziapkjz.D0gpz0HH.png",p="/IncompressibleNavierStokes.jl/previews/PR126/Actuator2D.mp4",l="/IncompressibleNavierStokes.jl/previews/PR126/assets/mqehavm.B0GX2W7p.png",t="/IncompressibleNavierStokes.jl/previews/PR126/assets/izkcxez.BjVPut0E.png",e="/IncompressibleNavierStokes.jl/previews/PR126/assets/ksyekmh.BQ4kmQL6.png",C=JSON.parse('{"title":"Unsteady actuator case - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/Actuator2D.md","filePath":"examples/generated/Actuator2D.md","lastUpdated":null}'),E={name:"examples/generated/Actuator2D.md"};function d(r,s,g,y,F,c){return h(),a("div",null,s[0]||(s[0]=[n(`Unsteady actuator case - 2D In this example, an unsteady inlet velocity profile at encounters a wind turbine blade in a wall-less domain. The blade is modeled as a uniform body force on a thin rectangle.
Packages A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Setup A 2D grid is a Cartesian product of two vectors
julia n = 40
+x = LinRange ( 0.0 , 10.0 , 5 n + 1 ), LinRange ( - 2.0 , 2.0 , 2 n + 1 )
+plotgrid (x ... ; figure = (; size = ( 600 , 300 )))
Boundary conditions
julia inflow (dim, x, y, t) = sinpi ( sinpi (t / 6 ) / 6 + (dim == 1 ) / 2 )
+boundary_conditions = (( DirichletBC (inflow), PressureBC ()), ( PressureBC (), PressureBC ()))
((DirichletBC{typeof(Main.inflow)}(Main.inflow), PressureBC()), (PressureBC(), PressureBC()))
Actuator body force: A thrust coefficient Cₜ
distributed over a thin rectangle
julia xc, yc = 2.0 , 0.0 # Disk center
+D = 1.0 # Disk diameter
+δ = 0.11 # Disk thickness
+C = 0.2 # Thrust coefficient
+c = C / (D * δ) # Normalize
+inside (x, y) = abs (x - xc) ≤ δ / 2 && abs (y - yc) ≤ D / 2
+bodyforce (dim, x, y, t) = - c * (dim == 1 ) * inside (x, y)
bodyforce (generic function with 1 method)
Build setup
julia setup = Setup (; x, Re = 100.0 , boundary_conditions, bodyforce, issteadybodyforce = true );
Initial conditions (extend inflow)
julia ustart = velocityfield (setup, (dim, x, y) -> inflow (dim, x, y, 0.0 ))
202×83×2 Array{Float64, 3}:
+[:, :, 1] =
+ 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 … 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 … 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ ⋮ ⋮ ⋱ ⋮
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 … 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 … 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+
+[:, :, 2] =
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ ⋮ ⋮ ⋱ ⋮
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Solve unsteady problem julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 12.0 ),
+ method = RKMethods . RK44P2 (),
+ Δt = 0.05 ,
+ processors = (
+ rtp = realtimeplotter (; setup, size = ( 600 , 300 ), nupdate = 5 ),
+ log = timelogger (; nupdate = 24 ),
+ ),
+);
[ Info: t = 1.2 Δt = 0.05 umax = 1.1 itertime = 0.11
+[ Info: t = 2.4 Δt = 0.05 umax = 1 itertime = 0.04
+[ Info: t = 3.6 Δt = 0.05 umax = 1 itertime = 0.0093
+[ Info: t = 4.8 Δt = 0.05 umax = 1 itertime = 0.0087
+[ Info: t = 6 Δt = 0.05 umax = 1 itertime = 0.0087
+[ Info: t = 7.2 Δt = 0.05 umax = 1 itertime = 0.0086
+[ Info: t = 8.4 Δt = 0.05 umax = 1 itertime = 0.0088
+[ Info: t = 9.6 Δt = 0.05 umax = 1 itertime = 0.0089
+[ Info: t = 10.8 Δt = 0.05 umax = 1 itertime = 0.009
+[ Info: t = 12 Δt = 0.05 umax = 1 itertime = 0.0087
Post-process We create a box to visualize the actuator.
julia box = (
+ [xc - δ / 2 , xc - δ / 2 , xc + δ / 2 , xc + δ / 2 , xc - δ / 2 ],
+ [yc + D / 2 , yc - D / 2 , yc - D / 2 , yc + D / 2 , yc + D / 2 ],
+)
([1.945, 1.945, 2.055, 2.055, 1.945], [0.5, -0.5, -0.5, 0.5, 0.5])
Plot pressure
julia fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :pressure )
+lines! (box ... ; color = :red )
+fig
Plot velocity
julia fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :velocitynorm )
+lines! (box ... ; color = :red )
+fig
Plot vorticity
julia fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :vorticity )
+lines! (box ... ; color = :red )
+fig
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+n = 40
+x = LinRange ( 0.0 , 10.0 , 5 n + 1 ), LinRange ( - 2.0 , 2.0 , 2 n + 1 )
+plotgrid (x ... ; figure = (; size = ( 600 , 300 )))
+
+inflow (dim, x, y, t) = sinpi ( sinpi (t / 6 ) / 6 + (dim == 1 ) / 2 )
+boundary_conditions = (( DirichletBC (inflow), PressureBC ()), ( PressureBC (), PressureBC ()))
+
+xc, yc = 2.0 , 0.0 # Disk center
+D = 1.0 # Disk diameter
+δ = 0.11 # Disk thickness
+C = 0.2 # Thrust coefficient
+c = C / (D * δ) # Normalize
+inside (x, y) = abs (x - xc) ≤ δ / 2 && abs (y - yc) ≤ D / 2
+bodyforce (dim, x, y, t) = - c * (dim == 1 ) * inside (x, y)
+
+setup = Setup (; x, Re = 100.0 , boundary_conditions, bodyforce, issteadybodyforce = true );
+
+ustart = velocityfield (setup, (dim, x, y) -> inflow (dim, x, y, 0.0 ))
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 12.0 ),
+ method = RKMethods . RK44P2 (),
+ Δt = 0.05 ,
+ processors = (
+ rtp = realtimeplotter (; setup, size = ( 600 , 300 ), nupdate = 5 ),
+ log = timelogger (; nupdate = 24 ),
+ ),
+);
+
+box = (
+ [xc - δ / 2 , xc - δ / 2 , xc + δ / 2 , xc + δ / 2 , xc - δ / 2 ],
+ [yc + D / 2 , yc - D / 2 , yc - D / 2 , yc + D / 2 , yc + D / 2 ],
+)
+
+fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :pressure )
+lines! (box ... ; color = :red )
+fig
+
+fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :velocitynorm )
+lines! (box ... ; color = :red )
+fig
+
+fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :vorticity )
+lines! (box ... ; color = :red )
+fig
This page was generated using Literate.jl .
`,42)]))}const u=i(E,[["render",d]]);export{C as __pageData,u as default};
diff --git a/previews/PR126/assets/examples_generated_Actuator2D.md.CjJk3Yks.lean.js b/previews/PR126/assets/examples_generated_Actuator2D.md.CjJk3Yks.lean.js
new file mode 100644
index 00000000..450aeea2
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_Actuator2D.md.CjJk3Yks.lean.js
@@ -0,0 +1,131 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const k="/IncompressibleNavierStokes.jl/previews/PR126/assets/ziapkjz.D0gpz0HH.png",p="/IncompressibleNavierStokes.jl/previews/PR126/Actuator2D.mp4",l="/IncompressibleNavierStokes.jl/previews/PR126/assets/mqehavm.B0GX2W7p.png",t="/IncompressibleNavierStokes.jl/previews/PR126/assets/izkcxez.BjVPut0E.png",e="/IncompressibleNavierStokes.jl/previews/PR126/assets/ksyekmh.BQ4kmQL6.png",C=JSON.parse('{"title":"Unsteady actuator case - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/Actuator2D.md","filePath":"examples/generated/Actuator2D.md","lastUpdated":null}'),E={name:"examples/generated/Actuator2D.md"};function d(r,s,g,y,F,c){return h(),a("div",null,s[0]||(s[0]=[n(`Unsteady actuator case - 2D In this example, an unsteady inlet velocity profile at encounters a wind turbine blade in a wall-less domain. The blade is modeled as a uniform body force on a thin rectangle.
Packages A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Setup A 2D grid is a Cartesian product of two vectors
julia n = 40
+x = LinRange ( 0.0 , 10.0 , 5 n + 1 ), LinRange ( - 2.0 , 2.0 , 2 n + 1 )
+plotgrid (x ... ; figure = (; size = ( 600 , 300 )))
Boundary conditions
julia inflow (dim, x, y, t) = sinpi ( sinpi (t / 6 ) / 6 + (dim == 1 ) / 2 )
+boundary_conditions = (( DirichletBC (inflow), PressureBC ()), ( PressureBC (), PressureBC ()))
((DirichletBC{typeof(Main.inflow)}(Main.inflow), PressureBC()), (PressureBC(), PressureBC()))
Actuator body force: A thrust coefficient Cₜ
distributed over a thin rectangle
julia xc, yc = 2.0 , 0.0 # Disk center
+D = 1.0 # Disk diameter
+δ = 0.11 # Disk thickness
+C = 0.2 # Thrust coefficient
+c = C / (D * δ) # Normalize
+inside (x, y) = abs (x - xc) ≤ δ / 2 && abs (y - yc) ≤ D / 2
+bodyforce (dim, x, y, t) = - c * (dim == 1 ) * inside (x, y)
bodyforce (generic function with 1 method)
Build setup
julia setup = Setup (; x, Re = 100.0 , boundary_conditions, bodyforce, issteadybodyforce = true );
Initial conditions (extend inflow)
julia ustart = velocityfield (setup, (dim, x, y) -> inflow (dim, x, y, 0.0 ))
202×83×2 Array{Float64, 3}:
+[:, :, 1] =
+ 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 … 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 … 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ ⋮ ⋮ ⋱ ⋮
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 … 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 … 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+ 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
+
+[:, :, 2] =
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ ⋮ ⋮ ⋱ ⋮
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
Solve unsteady problem julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 12.0 ),
+ method = RKMethods . RK44P2 (),
+ Δt = 0.05 ,
+ processors = (
+ rtp = realtimeplotter (; setup, size = ( 600 , 300 ), nupdate = 5 ),
+ log = timelogger (; nupdate = 24 ),
+ ),
+);
[ Info: t = 1.2 Δt = 0.05 umax = 1.1 itertime = 0.11
+[ Info: t = 2.4 Δt = 0.05 umax = 1 itertime = 0.04
+[ Info: t = 3.6 Δt = 0.05 umax = 1 itertime = 0.0093
+[ Info: t = 4.8 Δt = 0.05 umax = 1 itertime = 0.0087
+[ Info: t = 6 Δt = 0.05 umax = 1 itertime = 0.0087
+[ Info: t = 7.2 Δt = 0.05 umax = 1 itertime = 0.0086
+[ Info: t = 8.4 Δt = 0.05 umax = 1 itertime = 0.0088
+[ Info: t = 9.6 Δt = 0.05 umax = 1 itertime = 0.0089
+[ Info: t = 10.8 Δt = 0.05 umax = 1 itertime = 0.009
+[ Info: t = 12 Δt = 0.05 umax = 1 itertime = 0.0087
Post-process We create a box to visualize the actuator.
julia box = (
+ [xc - δ / 2 , xc - δ / 2 , xc + δ / 2 , xc + δ / 2 , xc - δ / 2 ],
+ [yc + D / 2 , yc - D / 2 , yc - D / 2 , yc + D / 2 , yc + D / 2 ],
+)
([1.945, 1.945, 2.055, 2.055, 1.945], [0.5, -0.5, -0.5, 0.5, 0.5])
Plot pressure
julia fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :pressure )
+lines! (box ... ; color = :red )
+fig
Plot velocity
julia fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :velocitynorm )
+lines! (box ... ; color = :red )
+fig
Plot vorticity
julia fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :vorticity )
+lines! (box ... ; color = :red )
+fig
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+n = 40
+x = LinRange ( 0.0 , 10.0 , 5 n + 1 ), LinRange ( - 2.0 , 2.0 , 2 n + 1 )
+plotgrid (x ... ; figure = (; size = ( 600 , 300 )))
+
+inflow (dim, x, y, t) = sinpi ( sinpi (t / 6 ) / 6 + (dim == 1 ) / 2 )
+boundary_conditions = (( DirichletBC (inflow), PressureBC ()), ( PressureBC (), PressureBC ()))
+
+xc, yc = 2.0 , 0.0 # Disk center
+D = 1.0 # Disk diameter
+δ = 0.11 # Disk thickness
+C = 0.2 # Thrust coefficient
+c = C / (D * δ) # Normalize
+inside (x, y) = abs (x - xc) ≤ δ / 2 && abs (y - yc) ≤ D / 2
+bodyforce (dim, x, y, t) = - c * (dim == 1 ) * inside (x, y)
+
+setup = Setup (; x, Re = 100.0 , boundary_conditions, bodyforce, issteadybodyforce = true );
+
+ustart = velocityfield (setup, (dim, x, y) -> inflow (dim, x, y, 0.0 ))
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 12.0 ),
+ method = RKMethods . RK44P2 (),
+ Δt = 0.05 ,
+ processors = (
+ rtp = realtimeplotter (; setup, size = ( 600 , 300 ), nupdate = 5 ),
+ log = timelogger (; nupdate = 24 ),
+ ),
+);
+
+box = (
+ [xc - δ / 2 , xc - δ / 2 , xc + δ / 2 , xc + δ / 2 , xc - δ / 2 ],
+ [yc + D / 2 , yc - D / 2 , yc - D / 2 , yc + D / 2 , yc + D / 2 ],
+)
+
+fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :pressure )
+lines! (box ... ; color = :red )
+fig
+
+fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :velocitynorm )
+lines! (box ... ; color = :red )
+fig
+
+fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :vorticity )
+lines! (box ... ; color = :red )
+fig
This page was generated using Literate.jl .
`,42)]))}const u=i(E,[["render",d]]);export{C as __pageData,u as default};
diff --git a/previews/PR126/assets/examples_generated_Actuator3D.md.DDNf_NQa.js b/previews/PR126/assets/examples_generated_Actuator3D.md.DDNf_NQa.js
new file mode 100644
index 00000000..acba18f2
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_Actuator3D.md.DDNf_NQa.js
@@ -0,0 +1,116 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Unsteady actuator case - 3D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/Actuator3D.md","filePath":"examples/generated/Actuator3D.md","lastUpdated":null}'),k={name:"examples/generated/Actuator3D.md"};function t(p,s,l,e,E,d){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Unsteady actuator case - 3D In this example, an unsteady inlet velocity profile at encounters a wind turbine blade in a wall-less domain. The blade is modeled as a uniform body force on a short cylinder.
We start by loading packages. A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "Actuator3D" )
Floating point type
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Reynolds number
A 3D grid is a Cartesian product of three vectors
julia x = LinRange ( 0.0 , 6.0 , 31 ), LinRange ( - 2.0 , 2.0 , 41 ), LinRange ( - 2.0 , 2.0 , 41 )
+plotgrid (x ... )
Boundary conditions: Unsteady BC requires time derivatives
julia boundary_conditions = (
+ # x left, x right
+ (
+ DirichletBC (
+ (dim, x, y, z, t) ->
+ dim == 1 ? cos ( π / 6 * sin ( π / 6 * t)) :
+ dim == 2 ? sin ( π / 6 * sin ( π / 6 * t)) : zero (x),
+ ),
+ PressureBC (),
+ ),
+
+ # y rear, y front
+ ( PressureBC (), PressureBC ()),
+
+ # z rear, z front
+ ( PressureBC (), PressureBC ()),
+)
Actuator body force: A thrust coefficient Cₜ
distributed over a short cylinder
julia cx, cy, cz = T ( 2 ), T ( 0 ), T ( 0 ) # Disk center
+D = T ( 1 ) # Disk diameter
+δ = T ( 0.11 ) # Disk thickness
+Cₜ = T ( 0.2 ) # Thrust coefficient
+cₜ = Cₜ / ( π * (D / 2 ) ^ 2 * δ)
+inside (x, y, z) = abs (x - cx) ≤ δ / 2 && (y - cy) ^ 2 + (z - cz) ^ 2 ≤ (D / 2 ) ^ 2
+bodyforce (dim, x, y, z) = dim == 1 ? - cₜ * inside (x, y, z) : zero (x)
Build setup and assemble operators
julia setup = Setup (; x, Re, boundary_conditions, bodyforce, backend);
+nothing #hide
Initial conditions (extend inflow)
julia ustart = velocityfield (setup, (dim, x, y, z) -> dim == 1 ? one (x) : zero (x));
+nothing #hide
Solve unsteady problem
julia (; u, t), outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 3 )),
+ method = RKMethods . RK44P2 (),
+ Δt = T ( 0.05 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = "$outdir", filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 1 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields (V, p)
Field plot
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "Actuator3D" )
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 100 )
+
+x = LinRange ( 0.0 , 6.0 , 31 ), LinRange ( - 2.0 , 2.0 , 41 ), LinRange ( - 2.0 , 2.0 , 41 )
+plotgrid (x ... )
+
+boundary_conditions = (
+ # x left, x right
+ (
+ DirichletBC (
+ (dim, x, y, z, t) ->
+ dim == 1 ? cos ( π / 6 * sin ( π / 6 * t)) :
+ dim == 2 ? sin ( π / 6 * sin ( π / 6 * t)) : zero (x),
+ ),
+ PressureBC (),
+ ),
+
+ # y rear, y front
+ ( PressureBC (), PressureBC ()),
+
+ # z rear, z front
+ ( PressureBC (), PressureBC ()),
+)
+
+cx, cy, cz = T ( 2 ), T ( 0 ), T ( 0 ) # Disk center
+D = T ( 1 ) # Disk diameter
+δ = T ( 0.11 ) # Disk thickness
+Cₜ = T ( 0.2 ) # Thrust coefficient
+cₜ = Cₜ / ( π * (D / 2 ) ^ 2 * δ)
+inside (x, y, z) = abs (x - cx) ≤ δ / 2 && (y - cy) ^ 2 + (z - cz) ^ 2 ≤ (D / 2 ) ^ 2
+bodyforce (dim, x, y, z) = dim == 1 ? - cₜ * inside (x, y, z) : zero (x)
+
+setup = Setup (; x, Re, boundary_conditions, bodyforce, backend);
+
+ustart = velocityfield (setup, (dim, x, y, z) -> dim == 1 ? one (x) : zero (x));
+
+(; u, t), outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 3 )),
+ method = RKMethods . RK44P2 (),
+ Δt = T ( 0.05 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = "$outdir", filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 1 ),
+ ),
+);
+
+outputs . rtp
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
This page was generated using Literate.jl .
`,36)]))}const y=i(k,[["render",t]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_Actuator3D.md.DDNf_NQa.lean.js b/previews/PR126/assets/examples_generated_Actuator3D.md.DDNf_NQa.lean.js
new file mode 100644
index 00000000..acba18f2
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_Actuator3D.md.DDNf_NQa.lean.js
@@ -0,0 +1,116 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Unsteady actuator case - 3D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/Actuator3D.md","filePath":"examples/generated/Actuator3D.md","lastUpdated":null}'),k={name:"examples/generated/Actuator3D.md"};function t(p,s,l,e,E,d){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Unsteady actuator case - 3D In this example, an unsteady inlet velocity profile at encounters a wind turbine blade in a wall-less domain. The blade is modeled as a uniform body force on a short cylinder.
We start by loading packages. A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "Actuator3D" )
Floating point type
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Reynolds number
A 3D grid is a Cartesian product of three vectors
julia x = LinRange ( 0.0 , 6.0 , 31 ), LinRange ( - 2.0 , 2.0 , 41 ), LinRange ( - 2.0 , 2.0 , 41 )
+plotgrid (x ... )
Boundary conditions: Unsteady BC requires time derivatives
julia boundary_conditions = (
+ # x left, x right
+ (
+ DirichletBC (
+ (dim, x, y, z, t) ->
+ dim == 1 ? cos ( π / 6 * sin ( π / 6 * t)) :
+ dim == 2 ? sin ( π / 6 * sin ( π / 6 * t)) : zero (x),
+ ),
+ PressureBC (),
+ ),
+
+ # y rear, y front
+ ( PressureBC (), PressureBC ()),
+
+ # z rear, z front
+ ( PressureBC (), PressureBC ()),
+)
Actuator body force: A thrust coefficient Cₜ
distributed over a short cylinder
julia cx, cy, cz = T ( 2 ), T ( 0 ), T ( 0 ) # Disk center
+D = T ( 1 ) # Disk diameter
+δ = T ( 0.11 ) # Disk thickness
+Cₜ = T ( 0.2 ) # Thrust coefficient
+cₜ = Cₜ / ( π * (D / 2 ) ^ 2 * δ)
+inside (x, y, z) = abs (x - cx) ≤ δ / 2 && (y - cy) ^ 2 + (z - cz) ^ 2 ≤ (D / 2 ) ^ 2
+bodyforce (dim, x, y, z) = dim == 1 ? - cₜ * inside (x, y, z) : zero (x)
Build setup and assemble operators
julia setup = Setup (; x, Re, boundary_conditions, bodyforce, backend);
+nothing #hide
Initial conditions (extend inflow)
julia ustart = velocityfield (setup, (dim, x, y, z) -> dim == 1 ? one (x) : zero (x));
+nothing #hide
Solve unsteady problem
julia (; u, t), outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 3 )),
+ method = RKMethods . RK44P2 (),
+ Δt = T ( 0.05 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = "$outdir", filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 1 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields (V, p)
Field plot
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "Actuator3D" )
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 100 )
+
+x = LinRange ( 0.0 , 6.0 , 31 ), LinRange ( - 2.0 , 2.0 , 41 ), LinRange ( - 2.0 , 2.0 , 41 )
+plotgrid (x ... )
+
+boundary_conditions = (
+ # x left, x right
+ (
+ DirichletBC (
+ (dim, x, y, z, t) ->
+ dim == 1 ? cos ( π / 6 * sin ( π / 6 * t)) :
+ dim == 2 ? sin ( π / 6 * sin ( π / 6 * t)) : zero (x),
+ ),
+ PressureBC (),
+ ),
+
+ # y rear, y front
+ ( PressureBC (), PressureBC ()),
+
+ # z rear, z front
+ ( PressureBC (), PressureBC ()),
+)
+
+cx, cy, cz = T ( 2 ), T ( 0 ), T ( 0 ) # Disk center
+D = T ( 1 ) # Disk diameter
+δ = T ( 0.11 ) # Disk thickness
+Cₜ = T ( 0.2 ) # Thrust coefficient
+cₜ = Cₜ / ( π * (D / 2 ) ^ 2 * δ)
+inside (x, y, z) = abs (x - cx) ≤ δ / 2 && (y - cy) ^ 2 + (z - cz) ^ 2 ≤ (D / 2 ) ^ 2
+bodyforce (dim, x, y, z) = dim == 1 ? - cₜ * inside (x, y, z) : zero (x)
+
+setup = Setup (; x, Re, boundary_conditions, bodyforce, backend);
+
+ustart = velocityfield (setup, (dim, x, y, z) -> dim == 1 ? one (x) : zero (x));
+
+(; u, t), outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 3 )),
+ method = RKMethods . RK44P2 (),
+ Δt = T ( 0.05 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = "$outdir", filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 1 ),
+ ),
+);
+
+outputs . rtp
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
This page was generated using Literate.jl .
`,36)]))}const y=i(k,[["render",t]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_BackwardFacingStep2D.md.B1L_JUM9.js b/previews/PR126/assets/examples_generated_BackwardFacingStep2D.md.B1L_JUM9.js
new file mode 100644
index 00000000..ef055957
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_BackwardFacingStep2D.md.B1L_JUM9.js
@@ -0,0 +1,96 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Backward Facing Step - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/BackwardFacingStep2D.md","filePath":"examples/generated/BackwardFacingStep2D.md","lastUpdated":null}'),t={name:"examples/generated/BackwardFacingStep2D.md"};function p(k,s,l,e,E,d){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Backward Facing Step - 2D In this example we consider a channel with walls at the top and bottom, and a step at the left with a parabolic inflow. Initially the velocity is an extension of the inflow, but as time passes the velocity finds a new steady state.
We start by loading packages. A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "BackwardFacingStep2D" )
Floating point type
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Reynolds number
Boundary conditions: steady inflow on the top half
julia U (dim, x, y, t) =
+ dim == 1 && y ≥ 0 ? 24 y * ( one (x) / 2 - y) : zero (x) + randn ( typeof (x)) / 1_000
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (U), PressureBC ()),
+
+ # y rear, y front
+ ( DirichletBC (), DirichletBC ()),
+)
A 2D grid is a Cartesian product of two vectors. Here we refine the grid near the walls.
julia x = LinRange ( T ( 0 ), T ( 10 ), 301 ), cosine_grid ( - T ( 0.5 ), T ( 0.5 ), 51 )
+plotgrid (x ... ; figure = (; size = ( 600 , 150 )))
Build setup and assemble operators
julia setup = Setup (; x, Re, boundary_conditions, backend);
+nothing #hide
Initial conditions (extend inflow)
julia ustart = velocityfield (setup, (dim, x, y) -> U (dim, x, y, zero (x)));
+nothing #hide
Solve steady state problem
julia # u, p = solve_steady_state(setup, u₀, p₀);
+nothing
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 7 )),
+ Δt = T ( 0.002 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ docolorbar = false ,
+ size = ( 600 , 150 ),
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 500 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Plot pressure
julia fieldplot (state; setup, size = ( 600 , 150 ), fieldname = :pressure )
Plot velocity
julia fieldplot (state; setup, size = ( 600 , 150 ), fieldname = :velocitynorm )
Plot vorticity
julia fieldplot (state; setup, size = ( 600 , 150 ), fieldname = :vorticity )
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "BackwardFacingStep2D" )
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 3_000 )
+
+U (dim, x, y, t) =
+ dim == 1 && y ≥ 0 ? 24 y * ( one (x) / 2 - y) : zero (x) + randn ( typeof (x)) / 1_000
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (U), PressureBC ()),
+
+ # y rear, y front
+ ( DirichletBC (), DirichletBC ()),
+)
+
+x = LinRange ( T ( 0 ), T ( 10 ), 301 ), cosine_grid ( - T ( 0.5 ), T ( 0.5 ), 51 )
+plotgrid (x ... ; figure = (; size = ( 600 , 150 )))
+
+setup = Setup (; x, Re, boundary_conditions, backend);
+
+ustart = velocityfield (setup, (dim, x, y) -> U (dim, x, y, zero (x)));
+
+# u, p = solve_steady_state(setup, u₀, p₀);
+nothing
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 7 )),
+ Δt = T ( 0.002 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ docolorbar = false ,
+ size = ( 600 , 150 ),
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 500 ),
+ ),
+);
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+fieldplot (state; setup, size = ( 600 , 150 ), fieldname = :pressure )
+
+fieldplot (state; setup, size = ( 600 , 150 ), fieldname = :velocitynorm )
+
+fieldplot (state; setup, size = ( 600 , 150 ), fieldname = :vorticity )
This page was generated using Literate.jl .
`,40)]))}const y=i(t,[["render",p]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_BackwardFacingStep2D.md.B1L_JUM9.lean.js b/previews/PR126/assets/examples_generated_BackwardFacingStep2D.md.B1L_JUM9.lean.js
new file mode 100644
index 00000000..ef055957
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_BackwardFacingStep2D.md.B1L_JUM9.lean.js
@@ -0,0 +1,96 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Backward Facing Step - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/BackwardFacingStep2D.md","filePath":"examples/generated/BackwardFacingStep2D.md","lastUpdated":null}'),t={name:"examples/generated/BackwardFacingStep2D.md"};function p(k,s,l,e,E,d){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Backward Facing Step - 2D In this example we consider a channel with walls at the top and bottom, and a step at the left with a parabolic inflow. Initially the velocity is an extension of the inflow, but as time passes the velocity finds a new steady state.
We start by loading packages. A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "BackwardFacingStep2D" )
Floating point type
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Reynolds number
Boundary conditions: steady inflow on the top half
julia U (dim, x, y, t) =
+ dim == 1 && y ≥ 0 ? 24 y * ( one (x) / 2 - y) : zero (x) + randn ( typeof (x)) / 1_000
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (U), PressureBC ()),
+
+ # y rear, y front
+ ( DirichletBC (), DirichletBC ()),
+)
A 2D grid is a Cartesian product of two vectors. Here we refine the grid near the walls.
julia x = LinRange ( T ( 0 ), T ( 10 ), 301 ), cosine_grid ( - T ( 0.5 ), T ( 0.5 ), 51 )
+plotgrid (x ... ; figure = (; size = ( 600 , 150 )))
Build setup and assemble operators
julia setup = Setup (; x, Re, boundary_conditions, backend);
+nothing #hide
Initial conditions (extend inflow)
julia ustart = velocityfield (setup, (dim, x, y) -> U (dim, x, y, zero (x)));
+nothing #hide
Solve steady state problem
julia # u, p = solve_steady_state(setup, u₀, p₀);
+nothing
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 7 )),
+ Δt = T ( 0.002 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ docolorbar = false ,
+ size = ( 600 , 150 ),
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 500 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Plot pressure
julia fieldplot (state; setup, size = ( 600 , 150 ), fieldname = :pressure )
Plot velocity
julia fieldplot (state; setup, size = ( 600 , 150 ), fieldname = :velocitynorm )
Plot vorticity
julia fieldplot (state; setup, size = ( 600 , 150 ), fieldname = :vorticity )
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "BackwardFacingStep2D" )
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 3_000 )
+
+U (dim, x, y, t) =
+ dim == 1 && y ≥ 0 ? 24 y * ( one (x) / 2 - y) : zero (x) + randn ( typeof (x)) / 1_000
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (U), PressureBC ()),
+
+ # y rear, y front
+ ( DirichletBC (), DirichletBC ()),
+)
+
+x = LinRange ( T ( 0 ), T ( 10 ), 301 ), cosine_grid ( - T ( 0.5 ), T ( 0.5 ), 51 )
+plotgrid (x ... ; figure = (; size = ( 600 , 150 )))
+
+setup = Setup (; x, Re, boundary_conditions, backend);
+
+ustart = velocityfield (setup, (dim, x, y) -> U (dim, x, y, zero (x)));
+
+# u, p = solve_steady_state(setup, u₀, p₀);
+nothing
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 7 )),
+ Δt = T ( 0.002 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ docolorbar = false ,
+ size = ( 600 , 150 ),
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 500 ),
+ ),
+);
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+fieldplot (state; setup, size = ( 600 , 150 ), fieldname = :pressure )
+
+fieldplot (state; setup, size = ( 600 , 150 ), fieldname = :velocitynorm )
+
+fieldplot (state; setup, size = ( 600 , 150 ), fieldname = :vorticity )
This page was generated using Literate.jl .
`,40)]))}const y=i(t,[["render",p]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_BackwardFacingStep3D.md.BQ3_PVJu.js b/previews/PR126/assets/examples_generated_BackwardFacingStep3D.md.BQ3_PVJu.js
new file mode 100644
index 00000000..dfd69af5
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_BackwardFacingStep3D.md.BQ3_PVJu.js
@@ -0,0 +1,99 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Backward Facing Step - 3D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/BackwardFacingStep3D.md","filePath":"examples/generated/BackwardFacingStep3D.md","lastUpdated":null}'),t={name:"examples/generated/BackwardFacingStep3D.md"};function p(l,s,k,e,E,d){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Backward Facing Step - 3D In this example we consider a channel with periodic side boundaries, walls at the top and bottom, and a step at the left with a parabolic inflow. Initially the velocity is an extension of the inflow, but as time passes the velocity finds a new steady state.
We start by loading packages. A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "BackwardFacingStep3D" )
Floating point type
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Reynolds number
A 3D grid is a Cartesian product of three vectors
julia x = LinRange ( T ( 0 ), T ( 10 ), 129 ),
+LinRange ( - T ( 0.5 ), T ( 0.5 ), 17 ),
+LinRange ( - T ( 0.25 ), T ( 0.25 ), 9 )
+plotgrid (x ... )
Boundary conditions: steady inflow on the top half
julia U (dim, x, y, z, t) = dim == 1 && y ≥ 0 ? 24 y * ( one (x) / 2 - y) : zero (x)
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (U), PressureBC ()),
+
+ # y rear, y front
+ ( DirichletBC (), DirichletBC ()),
+
+ # z bottom, z top
+ ( PeriodicBC (), PeriodicBC ()),
+)
Build setup and assemble operators
julia setup = Setup (; x, Re, boundary_conditions, backend);
+nothing #hide
Initial conditions (extend inflow)
julia ustart = velocityfield (setup, (dim, x, y, z) -> U (dim, x, y, z, zero (x)));
+nothing #hide
Solve steady state problem
julia # u, p = solve_steady_state(setup, u₀, p₀);
+nothing
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 7 )),
+ Δt = T ( 0.01 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+)
Post-process We may visualize or export the computed fields
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Plot pressure
julia fieldplot (state; setup, fieldname = :pressure )
Plot velocity
julia fieldplot (state; setup, fieldname = :velocitynorm )
Plot vorticity
julia fieldplot (state; setup, fieldname = :vorticity )
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "BackwardFacingStep3D" )
+
+T = Float32
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 1000 )
+
+x = LinRange ( T ( 0 ), T ( 10 ), 129 ),
+LinRange ( - T ( 0.5 ), T ( 0.5 ), 17 ),
+LinRange ( - T ( 0.25 ), T ( 0.25 ), 9 )
+plotgrid (x ... )
+
+U (dim, x, y, z, t) = dim == 1 && y ≥ 0 ? 24 y * ( one (x) / 2 - y) : zero (x)
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (U), PressureBC ()),
+
+ # y rear, y front
+ ( DirichletBC (), DirichletBC ()),
+
+ # z bottom, z top
+ ( PeriodicBC (), PeriodicBC ()),
+)
+
+setup = Setup (; x, Re, boundary_conditions, backend);
+
+ustart = velocityfield (setup, (dim, x, y, z) -> U (dim, x, y, z, zero (x)));
+
+# u, p = solve_steady_state(setup, u₀, p₀);
+nothing
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 7 )),
+ Δt = T ( 0.01 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+)
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+fieldplot (state; setup, fieldname = :pressure )
+
+fieldplot (state; setup, fieldname = :velocitynorm )
+
+fieldplot (state; setup, fieldname = :vorticity )
This page was generated using Literate.jl .
`,40)]))}const y=i(t,[["render",p]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_BackwardFacingStep3D.md.BQ3_PVJu.lean.js b/previews/PR126/assets/examples_generated_BackwardFacingStep3D.md.BQ3_PVJu.lean.js
new file mode 100644
index 00000000..dfd69af5
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_BackwardFacingStep3D.md.BQ3_PVJu.lean.js
@@ -0,0 +1,99 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Backward Facing Step - 3D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/BackwardFacingStep3D.md","filePath":"examples/generated/BackwardFacingStep3D.md","lastUpdated":null}'),t={name:"examples/generated/BackwardFacingStep3D.md"};function p(l,s,k,e,E,d){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Backward Facing Step - 3D In this example we consider a channel with periodic side boundaries, walls at the top and bottom, and a step at the left with a parabolic inflow. Initially the velocity is an extension of the inflow, but as time passes the velocity finds a new steady state.
We start by loading packages. A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "BackwardFacingStep3D" )
Floating point type
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Reynolds number
A 3D grid is a Cartesian product of three vectors
julia x = LinRange ( T ( 0 ), T ( 10 ), 129 ),
+LinRange ( - T ( 0.5 ), T ( 0.5 ), 17 ),
+LinRange ( - T ( 0.25 ), T ( 0.25 ), 9 )
+plotgrid (x ... )
Boundary conditions: steady inflow on the top half
julia U (dim, x, y, z, t) = dim == 1 && y ≥ 0 ? 24 y * ( one (x) / 2 - y) : zero (x)
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (U), PressureBC ()),
+
+ # y rear, y front
+ ( DirichletBC (), DirichletBC ()),
+
+ # z bottom, z top
+ ( PeriodicBC (), PeriodicBC ()),
+)
Build setup and assemble operators
julia setup = Setup (; x, Re, boundary_conditions, backend);
+nothing #hide
Initial conditions (extend inflow)
julia ustart = velocityfield (setup, (dim, x, y, z) -> U (dim, x, y, z, zero (x)));
+nothing #hide
Solve steady state problem
julia # u, p = solve_steady_state(setup, u₀, p₀);
+nothing
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 7 )),
+ Δt = T ( 0.01 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+)
Post-process We may visualize or export the computed fields
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Plot pressure
julia fieldplot (state; setup, fieldname = :pressure )
Plot velocity
julia fieldplot (state; setup, fieldname = :velocitynorm )
Plot vorticity
julia fieldplot (state; setup, fieldname = :vorticity )
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "BackwardFacingStep3D" )
+
+T = Float32
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 1000 )
+
+x = LinRange ( T ( 0 ), T ( 10 ), 129 ),
+LinRange ( - T ( 0.5 ), T ( 0.5 ), 17 ),
+LinRange ( - T ( 0.25 ), T ( 0.25 ), 9 )
+plotgrid (x ... )
+
+U (dim, x, y, z, t) = dim == 1 && y ≥ 0 ? 24 y * ( one (x) / 2 - y) : zero (x)
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (U), PressureBC ()),
+
+ # y rear, y front
+ ( DirichletBC (), DirichletBC ()),
+
+ # z bottom, z top
+ ( PeriodicBC (), PeriodicBC ()),
+)
+
+setup = Setup (; x, Re, boundary_conditions, backend);
+
+ustart = velocityfield (setup, (dim, x, y, z) -> U (dim, x, y, z, zero (x)));
+
+# u, p = solve_steady_state(setup, u₀, p₀);
+nothing
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 7 )),
+ Δt = T ( 0.01 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+)
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+fieldplot (state; setup, fieldname = :pressure )
+
+fieldplot (state; setup, fieldname = :velocitynorm )
+
+fieldplot (state; setup, fieldname = :vorticity )
This page was generated using Literate.jl .
`,40)]))}const y=i(t,[["render",p]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_DecayingTurbulence2D.md.WF0Cn1Zb.js b/previews/PR126/assets/examples_generated_DecayingTurbulence2D.md.WF0Cn1Zb.js
new file mode 100644
index 00000000..a149eee4
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_DecayingTurbulence2D.md.WF0Cn1Zb.js
@@ -0,0 +1,66 @@
+import{_ as i,c as a,a5 as n,o as p}from"./chunks/framework.BSoZtefh.js";const t="/IncompressibleNavierStokes.jl/previews/PR126/DecayingTurbulence2D.mp4",l="/IncompressibleNavierStokes.jl/previews/PR126/assets/smpfhbj.J4Xy6kEr.png",e="/IncompressibleNavierStokes.jl/previews/PR126/assets/ncjebvf.Ckr30c9N.png",h="/IncompressibleNavierStokes.jl/previews/PR126/assets/ylwwdlu.DcGjID-r.png",u=JSON.parse('{"title":"Decaying Homogeneous Isotropic Turbulence - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/DecayingTurbulence2D.md","filePath":"examples/generated/DecayingTurbulence2D.md","lastUpdated":null}'),k={name:"examples/generated/DecayingTurbulence2D.md"};function E(r,s,d,g,y,o){return p(),a("div",null,s[0]||(s[0]=[n(`Decaying Homogeneous Isotropic Turbulence - 2D In this example we consider decaying homogeneous isotropic turbulence, similar to the cases considered in [1 ] and [2 ]. The initial velocity field is created randomly, but with a specific energy spectrum. Due to viscous dissipation, the turbulent features eventually group to form larger visible eddies.
Packages We just need IncompressibleNavierStokes and a Makie plotting backend.
julia using CairoMakie
+using IncompressibleNavierStokes
Setup
julia n = 256
+ax = LinRange ( 0.0 , 1.0 , n + 1 )
+setup = Setup (; x = (ax, ax), Re = 4e3 );
+ustart = random_field (setup, 0.0 );
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 1.0 ),
+ processors = (
+ rtp = realtimeplotter (; setup, nupdate = 10 ),
+ ehist = realtimeplotter (;
+ setup,
+ plot = energy_history_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ espec = realtimeplotter (;
+ setup,
+ plot = energy_spectrum_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
[ Info: t = 0.0955696 Δt = 0.00098 umax = 3.6 itertime = 0.027
+[ Info: t = 0.193437 Δt = 0.0011 umax = 3.3 itertime = 0.016
+[ Info: t = 0.303347 Δt = 0.0013 umax = 2.8 itertime = 0.015
+[ Info: t = 0.427623 Δt = 0.0012 umax = 2.9 itertime = 0.015
+[ Info: t = 0.549335 Δt = 0.0012 umax = 3 itertime = 0.015
+[ Info: t = 0.669572 Δt = 0.0015 umax = 2.4 itertime = 0.015
+[ Info: t = 0.81377 Δt = 0.0013 umax = 2.7 itertime = 0.015
+[ Info: t = 0.935269 Δt = 0.0012 umax = 2.8 itertime = 0.015
Post-process We may visualize or export the computed fields
Energy history
Energy spectrum
Plot field
julia fieldplot (state; setup)
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+n = 256
+ax = LinRange ( 0.0 , 1.0 , n + 1 )
+setup = Setup (; x = (ax, ax), Re = 4e3 );
+ustart = random_field (setup, 0.0 );
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 1.0 ),
+ processors = (
+ rtp = realtimeplotter (; setup, nupdate = 10 ),
+ ehist = realtimeplotter (;
+ setup,
+ plot = energy_history_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ espec = realtimeplotter (;
+ setup,
+ plot = energy_spectrum_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+outputs . ehist
+
+outputs . espec
+
+fieldplot (state; setup)
This page was generated using Literate.jl .
`,27)]))}const F=i(k,[["render",E]]);export{u as __pageData,F as default};
diff --git a/previews/PR126/assets/examples_generated_DecayingTurbulence2D.md.WF0Cn1Zb.lean.js b/previews/PR126/assets/examples_generated_DecayingTurbulence2D.md.WF0Cn1Zb.lean.js
new file mode 100644
index 00000000..a149eee4
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_DecayingTurbulence2D.md.WF0Cn1Zb.lean.js
@@ -0,0 +1,66 @@
+import{_ as i,c as a,a5 as n,o as p}from"./chunks/framework.BSoZtefh.js";const t="/IncompressibleNavierStokes.jl/previews/PR126/DecayingTurbulence2D.mp4",l="/IncompressibleNavierStokes.jl/previews/PR126/assets/smpfhbj.J4Xy6kEr.png",e="/IncompressibleNavierStokes.jl/previews/PR126/assets/ncjebvf.Ckr30c9N.png",h="/IncompressibleNavierStokes.jl/previews/PR126/assets/ylwwdlu.DcGjID-r.png",u=JSON.parse('{"title":"Decaying Homogeneous Isotropic Turbulence - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/DecayingTurbulence2D.md","filePath":"examples/generated/DecayingTurbulence2D.md","lastUpdated":null}'),k={name:"examples/generated/DecayingTurbulence2D.md"};function E(r,s,d,g,y,o){return p(),a("div",null,s[0]||(s[0]=[n(`Decaying Homogeneous Isotropic Turbulence - 2D In this example we consider decaying homogeneous isotropic turbulence, similar to the cases considered in [1 ] and [2 ]. The initial velocity field is created randomly, but with a specific energy spectrum. Due to viscous dissipation, the turbulent features eventually group to form larger visible eddies.
Packages We just need IncompressibleNavierStokes and a Makie plotting backend.
julia using CairoMakie
+using IncompressibleNavierStokes
Setup
julia n = 256
+ax = LinRange ( 0.0 , 1.0 , n + 1 )
+setup = Setup (; x = (ax, ax), Re = 4e3 );
+ustart = random_field (setup, 0.0 );
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 1.0 ),
+ processors = (
+ rtp = realtimeplotter (; setup, nupdate = 10 ),
+ ehist = realtimeplotter (;
+ setup,
+ plot = energy_history_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ espec = realtimeplotter (;
+ setup,
+ plot = energy_spectrum_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
[ Info: t = 0.0955696 Δt = 0.00098 umax = 3.6 itertime = 0.027
+[ Info: t = 0.193437 Δt = 0.0011 umax = 3.3 itertime = 0.016
+[ Info: t = 0.303347 Δt = 0.0013 umax = 2.8 itertime = 0.015
+[ Info: t = 0.427623 Δt = 0.0012 umax = 2.9 itertime = 0.015
+[ Info: t = 0.549335 Δt = 0.0012 umax = 3 itertime = 0.015
+[ Info: t = 0.669572 Δt = 0.0015 umax = 2.4 itertime = 0.015
+[ Info: t = 0.81377 Δt = 0.0013 umax = 2.7 itertime = 0.015
+[ Info: t = 0.935269 Δt = 0.0012 umax = 2.8 itertime = 0.015
Post-process We may visualize or export the computed fields
Energy history
Energy spectrum
Plot field
julia fieldplot (state; setup)
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+n = 256
+ax = LinRange ( 0.0 , 1.0 , n + 1 )
+setup = Setup (; x = (ax, ax), Re = 4e3 );
+ustart = random_field (setup, 0.0 );
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 1.0 ),
+ processors = (
+ rtp = realtimeplotter (; setup, nupdate = 10 ),
+ ehist = realtimeplotter (;
+ setup,
+ plot = energy_history_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ espec = realtimeplotter (;
+ setup,
+ plot = energy_spectrum_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+outputs . ehist
+
+outputs . espec
+
+fieldplot (state; setup)
This page was generated using Literate.jl .
`,27)]))}const F=i(k,[["render",E]]);export{u as __pageData,F as default};
diff --git a/previews/PR126/assets/examples_generated_DecayingTurbulence3D.md.CPesWMyv.js b/previews/PR126/assets/examples_generated_DecayingTurbulence3D.md.CPesWMyv.js
new file mode 100644
index 00000000..a727fbde
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_DecayingTurbulence3D.md.CPesWMyv.js
@@ -0,0 +1,57 @@
+import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Decaying Homogeneous Isotropic Turbulence - 3D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/DecayingTurbulence3D.md","filePath":"examples/generated/DecayingTurbulence3D.md","lastUpdated":null}'),p={name:"examples/generated/DecayingTurbulence3D.md"};function l(e,s,h,k,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Decaying Homogeneous Isotropic Turbulence - 3D In this example we consider decaying homogeneous isotropic turbulence, similar to the cases considered in [1 ] and [2 ]. The initial velocity field is created randomly, but with a specific energy spectrum. Due to viscous dissipation, the turbulent features eventually group to form larger visible eddies.
julia using CairoMakie
+using IncompressibleNavierStokes
Problem setup julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
+T = Float32
+n = 128
+ax = range ( T ( 0 ), T ( 1 ), n + 1 )
+setup = Setup (; x = (ax, ax, ax), Re = T ( 4e3 ), backend);
+psolver = default_psolver (setup);
+ustart = random_field (setup; psolver);
+nothing #hide
Solve problem julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 2 )),
+ psolver,
+ processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 10),
+ # ehist = realtimeplotter(; setup, plot = energy_history_plot, nupdate = 10),
+ espec = realtimeplotter (; setup, plot = energy_spectrum_plot, nupdate = 10 ),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ log = timelogger (; nupdate = 10 ),
+ ),
+);
+nothing #hide
Post-process Field plot
julia # outputs.rtp
+# fieldplot(state; setup, levels = 0:5)
Energy history
Energy spectrum
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+T = Float32
+n = 128
+ax = range ( T ( 0 ), T ( 1 ), n + 1 )
+setup = Setup (; x = (ax, ax, ax), Re = T ( 4e3 ), backend);
+psolver = default_psolver (setup);
+ustart = random_field (setup; psolver);
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 2 )),
+ psolver,
+ processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 10),
+ # ehist = realtimeplotter(; setup, plot = energy_history_plot, nupdate = 10),
+ espec = realtimeplotter (; setup, plot = energy_spectrum_plot, nupdate = 10 ),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ log = timelogger (; nupdate = 10 ),
+ ),
+);
+
+# outputs.rtp
+# fieldplot(state; setup, levels = 0:5)
+
+# outputs.ehist
+
+outputs . espec
This page was generated using Literate.jl .
`,20)]))}const o=i(p,[["render",l]]);export{g as __pageData,o as default};
diff --git a/previews/PR126/assets/examples_generated_DecayingTurbulence3D.md.CPesWMyv.lean.js b/previews/PR126/assets/examples_generated_DecayingTurbulence3D.md.CPesWMyv.lean.js
new file mode 100644
index 00000000..a727fbde
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_DecayingTurbulence3D.md.CPesWMyv.lean.js
@@ -0,0 +1,57 @@
+import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Decaying Homogeneous Isotropic Turbulence - 3D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/DecayingTurbulence3D.md","filePath":"examples/generated/DecayingTurbulence3D.md","lastUpdated":null}'),p={name:"examples/generated/DecayingTurbulence3D.md"};function l(e,s,h,k,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Decaying Homogeneous Isotropic Turbulence - 3D In this example we consider decaying homogeneous isotropic turbulence, similar to the cases considered in [1 ] and [2 ]. The initial velocity field is created randomly, but with a specific energy spectrum. Due to viscous dissipation, the turbulent features eventually group to form larger visible eddies.
julia using CairoMakie
+using IncompressibleNavierStokes
Problem setup julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
+T = Float32
+n = 128
+ax = range ( T ( 0 ), T ( 1 ), n + 1 )
+setup = Setup (; x = (ax, ax, ax), Re = T ( 4e3 ), backend);
+psolver = default_psolver (setup);
+ustart = random_field (setup; psolver);
+nothing #hide
Solve problem julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 2 )),
+ psolver,
+ processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 10),
+ # ehist = realtimeplotter(; setup, plot = energy_history_plot, nupdate = 10),
+ espec = realtimeplotter (; setup, plot = energy_spectrum_plot, nupdate = 10 ),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ log = timelogger (; nupdate = 10 ),
+ ),
+);
+nothing #hide
Post-process Field plot
julia # outputs.rtp
+# fieldplot(state; setup, levels = 0:5)
Energy history
Energy spectrum
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+T = Float32
+n = 128
+ax = range ( T ( 0 ), T ( 1 ), n + 1 )
+setup = Setup (; x = (ax, ax, ax), Re = T ( 4e3 ), backend);
+psolver = default_psolver (setup);
+ustart = random_field (setup; psolver);
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 2 )),
+ psolver,
+ processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 10),
+ # ehist = realtimeplotter(; setup, plot = energy_history_plot, nupdate = 10),
+ espec = realtimeplotter (; setup, plot = energy_spectrum_plot, nupdate = 10 ),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ log = timelogger (; nupdate = 10 ),
+ ),
+);
+
+# outputs.rtp
+# fieldplot(state; setup, levels = 0:5)
+
+# outputs.ehist
+
+outputs . espec
This page was generated using Literate.jl .
`,20)]))}const o=i(p,[["render",l]]);export{g as __pageData,o as default};
diff --git a/previews/PR126/assets/examples_generated_Kolmogorov2D.md.C7XWVq5k.js b/previews/PR126/assets/examples_generated_Kolmogorov2D.md.C7XWVq5k.js
new file mode 100644
index 00000000..c8157a24
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_Kolmogorov2D.md.C7XWVq5k.js
@@ -0,0 +1,75 @@
+import{_ as h,c as a,j as s,a as t,a5 as n,o as l}from"./chunks/framework.BSoZtefh.js";const c=JSON.parse('{"title":"Kolmogorov flow (2D)","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/Kolmogorov2D.md","filePath":"examples/generated/Kolmogorov2D.md","lastUpdated":null}'),p={name:"examples/generated/Kolmogorov2D.md"},e={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.165ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 4492.8 1083.9","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.149ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.876ex",height:"5.43ex",role:"img",focusable:"false",viewBox:"0 -1450 9227.2 2400","aria-hidden":"true"};function E(g,i,o,y,T,Q){return l(),a("div",null,[i[6]||(i[6]=s("p",null,[s("em",null,"Note: Output is not generated for this example (to save resources on GitHub).")],-1)),i[7]||(i[7]=s("h1",{id:"Kolmogorov-flow-(2D)",tabindex:"-1"},[t("Kolmogorov flow (2D) "),s("a",{class:"header-anchor",href:"#Kolmogorov-flow-(2D)","aria-label":'Permalink to "Kolmogorov flow (2D) {#Kolmogorov-flow-(2D)}"'},"")],-1)),s("p",null,[i[2]||(i[2]=t("The Kolmogorov flow in a periodic box ")),s("mjx-container",e,[(l(),a("svg",k,i[0]||(i[0]=[n(' ',1)]))),i[1]||(i[1]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",{mathvariant:"normal"},"Ω"),s("mo",null,"="),s("mo",{stretchy:"false"},"["),s("mn",null,"0"),s("mo",null,","),s("mn",null,"1"),s("msup",null,[s("mo",{stretchy:"false"},"]"),s("mn",null,"2")])])],-1))]),i[3]||(i[3]=t(" is initiated via the force field"))]),s("mjx-container",r,[(l(),a("svg",d,i[4]||(i[4]=[n(' ',1)]))),i[5]||(i[5]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mi",null,"f"),s("mo",{stretchy:"false"},"("),s("mi",null,"x"),s("mo",null,","),s("mi",null,"y"),s("mo",{stretchy:"false"},")"),s("mo",null,"="),s("mrow",{"data-mjx-texclass":"INNER"},[s("mo",{"data-mjx-texclass":"OPEN"},"("),s("mtable",{columnspacing:"1em",rowspacing:"4pt"},[s("mtr",null,[s("mtd",null,[s("mi",null,"sin"),s("mo",{"data-mjx-texclass":"NONE"},""),s("mo",{stretchy:"false"},"("),s("mi",null,"π"),s("mi",null,"k"),s("mi",null,"y"),s("mo",{stretchy:"false"},")")])]),s("mtr",null,[s("mtd",null,[s("mn",null,"0")])])]),s("mo",{"data-mjx-texclass":"CLOSE"},")")])])],-1))]),i[8]||(i[8]=n(`where k
is the wavenumber where energy is injected.
Packages We just need the IncompressibleNavierStokes
and a Makie plotting package.
julia using CairoMakie
+using IncompressibleNavierStokes
Setup Define a uniform grid with a steady body force field.
julia n = 256
+axis = range ( 0.0 , 1.0 , n + 1 )
+setup = Setup (;
+ x = (axis, axis),
+ Re = 2e3 ,
+ bodyforce = (dim, x, y, t) -> (dim == 1 ) * 5 * sinpi ( 8 * y),
+ issteadybodyforce = true ,
+);
+ustart = random_field (setup, 0.0 ; A = 1e-2 );
+nothing #hide
Plot body force Since the force is steady, it is just stored as a field.
julia heatmap (setup . bodyforce[:, :, 1 ])
Solve unsteady problem julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 2.0 ),
+ Δt = 1e-3 ,
+ processors = (
+ rtp = realtimeplotter (; setup, nupdate = 100 ),
+ ehist = realtimeplotter (;
+ setup,
+ plot = energy_history_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ espec = realtimeplotter (;
+ setup,
+ plot = energy_spectrum_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+nothing #hide
Field plot
Energy history
Energy spectrum
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+n = 256
+axis = range ( 0.0 , 1.0 , n + 1 )
+setup = Setup (;
+ x = (axis, axis),
+ Re = 2e3 ,
+ bodyforce = (dim, x, y, t) -> (dim == 1 ) * 5 * sinpi ( 8 * y),
+ issteadybodyforce = true ,
+);
+ustart = random_field (setup, 0.0 ; A = 1e-2 );
+
+heatmap (setup . bodyforce[:, :, 1 ])
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 2.0 ),
+ Δt = 1e-3 ,
+ processors = (
+ rtp = realtimeplotter (; setup, nupdate = 100 ),
+ ehist = realtimeplotter (;
+ setup,
+ plot = energy_history_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ espec = realtimeplotter (;
+ setup,
+ plot = energy_spectrum_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+outputs . rtp
+
+outputs . ehist
+
+outputs . espec
This page was generated using Literate.jl .
`,23))])}const u=h(p,[["render",E]]);export{c as __pageData,u as default};
diff --git a/previews/PR126/assets/examples_generated_Kolmogorov2D.md.C7XWVq5k.lean.js b/previews/PR126/assets/examples_generated_Kolmogorov2D.md.C7XWVq5k.lean.js
new file mode 100644
index 00000000..c8157a24
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_Kolmogorov2D.md.C7XWVq5k.lean.js
@@ -0,0 +1,75 @@
+import{_ as h,c as a,j as s,a as t,a5 as n,o as l}from"./chunks/framework.BSoZtefh.js";const c=JSON.parse('{"title":"Kolmogorov flow (2D)","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/Kolmogorov2D.md","filePath":"examples/generated/Kolmogorov2D.md","lastUpdated":null}'),p={name:"examples/generated/Kolmogorov2D.md"},e={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.165ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 4492.8 1083.9","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.149ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.876ex",height:"5.43ex",role:"img",focusable:"false",viewBox:"0 -1450 9227.2 2400","aria-hidden":"true"};function E(g,i,o,y,T,Q){return l(),a("div",null,[i[6]||(i[6]=s("p",null,[s("em",null,"Note: Output is not generated for this example (to save resources on GitHub).")],-1)),i[7]||(i[7]=s("h1",{id:"Kolmogorov-flow-(2D)",tabindex:"-1"},[t("Kolmogorov flow (2D) "),s("a",{class:"header-anchor",href:"#Kolmogorov-flow-(2D)","aria-label":'Permalink to "Kolmogorov flow (2D) {#Kolmogorov-flow-(2D)}"'},"")],-1)),s("p",null,[i[2]||(i[2]=t("The Kolmogorov flow in a periodic box ")),s("mjx-container",e,[(l(),a("svg",k,i[0]||(i[0]=[n(' ',1)]))),i[1]||(i[1]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",{mathvariant:"normal"},"Ω"),s("mo",null,"="),s("mo",{stretchy:"false"},"["),s("mn",null,"0"),s("mo",null,","),s("mn",null,"1"),s("msup",null,[s("mo",{stretchy:"false"},"]"),s("mn",null,"2")])])],-1))]),i[3]||(i[3]=t(" is initiated via the force field"))]),s("mjx-container",r,[(l(),a("svg",d,i[4]||(i[4]=[n(' ',1)]))),i[5]||(i[5]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mi",null,"f"),s("mo",{stretchy:"false"},"("),s("mi",null,"x"),s("mo",null,","),s("mi",null,"y"),s("mo",{stretchy:"false"},")"),s("mo",null,"="),s("mrow",{"data-mjx-texclass":"INNER"},[s("mo",{"data-mjx-texclass":"OPEN"},"("),s("mtable",{columnspacing:"1em",rowspacing:"4pt"},[s("mtr",null,[s("mtd",null,[s("mi",null,"sin"),s("mo",{"data-mjx-texclass":"NONE"},""),s("mo",{stretchy:"false"},"("),s("mi",null,"π"),s("mi",null,"k"),s("mi",null,"y"),s("mo",{stretchy:"false"},")")])]),s("mtr",null,[s("mtd",null,[s("mn",null,"0")])])]),s("mo",{"data-mjx-texclass":"CLOSE"},")")])])],-1))]),i[8]||(i[8]=n(`where k
is the wavenumber where energy is injected.
Packages We just need the IncompressibleNavierStokes
and a Makie plotting package.
julia using CairoMakie
+using IncompressibleNavierStokes
Setup Define a uniform grid with a steady body force field.
julia n = 256
+axis = range ( 0.0 , 1.0 , n + 1 )
+setup = Setup (;
+ x = (axis, axis),
+ Re = 2e3 ,
+ bodyforce = (dim, x, y, t) -> (dim == 1 ) * 5 * sinpi ( 8 * y),
+ issteadybodyforce = true ,
+);
+ustart = random_field (setup, 0.0 ; A = 1e-2 );
+nothing #hide
Plot body force Since the force is steady, it is just stored as a field.
julia heatmap (setup . bodyforce[:, :, 1 ])
Solve unsteady problem julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 2.0 ),
+ Δt = 1e-3 ,
+ processors = (
+ rtp = realtimeplotter (; setup, nupdate = 100 ),
+ ehist = realtimeplotter (;
+ setup,
+ plot = energy_history_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ espec = realtimeplotter (;
+ setup,
+ plot = energy_spectrum_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+nothing #hide
Field plot
Energy history
Energy spectrum
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+n = 256
+axis = range ( 0.0 , 1.0 , n + 1 )
+setup = Setup (;
+ x = (axis, axis),
+ Re = 2e3 ,
+ bodyforce = (dim, x, y, t) -> (dim == 1 ) * 5 * sinpi ( 8 * y),
+ issteadybodyforce = true ,
+);
+ustart = random_field (setup, 0.0 ; A = 1e-2 );
+
+heatmap (setup . bodyforce[:, :, 1 ])
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 2.0 ),
+ Δt = 1e-3 ,
+ processors = (
+ rtp = realtimeplotter (; setup, nupdate = 100 ),
+ ehist = realtimeplotter (;
+ setup,
+ plot = energy_history_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ espec = realtimeplotter (;
+ setup,
+ plot = energy_spectrum_plot,
+ nupdate = 10 ,
+ displayfig = false ,
+ ),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+outputs . rtp
+
+outputs . ehist
+
+outputs . espec
This page was generated using Literate.jl .
`,23))])}const u=h(p,[["render",E]]);export{c as __pageData,u as default};
diff --git a/previews/PR126/assets/examples_generated_LidDrivenCavity2D.md.D_iNsMnv.js b/previews/PR126/assets/examples_generated_LidDrivenCavity2D.md.D_iNsMnv.js
new file mode 100644
index 00000000..7912e64c
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_LidDrivenCavity2D.md.D_iNsMnv.js
@@ -0,0 +1,91 @@
+import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.BSoZtefh.js";const o=JSON.parse('{"title":"Tutorial: Lid-Driven Cavity - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/LidDrivenCavity2D.md","filePath":"examples/generated/LidDrivenCavity2D.md","lastUpdated":null}'),l={name:"examples/generated/LidDrivenCavity2D.md"};function p(e,s,h,k,d,r){return t(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Tutorial: Lid-Driven Cavity - 2D In this example we consider a box with a moving lid. The velocity is initially at rest. The solution should reach at steady state equilibrium after a certain time. The same steady state should be obtained when solving a steady state problem.
We start by loading packages. A Makie plotting backend is needed
for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Case name for saving results
julia outdir = joinpath ( @__DIR__ , "output" , "LidDrivenCavity2D" )
The code allows for using different floating point number types, including single precision (Float32
) and double precision (Float64
). On the CPU, the speed is not really different, but double precision uses twice as much memory as single precision. When running on the GPU, single precision is preferred. Half precision (Float16
) is also an option, but then the values should be scaled judiciously to avoid vanishing digits when applying differential operators of the form "right minus left divided by small distance".
Note how floating point type hygiene is enforced in the following using T
to avoid mixing different precisions.
T = Float64
julia T = Float32
+# T = Float16
We can also choose to do the computations on a different device. By default, the computations are performed on the host (CPU). An optional backend
allows for moving arrays to a different device such as a GPU.
Note: For GPUs, single precision is preferred.
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Here we choose a moderate Reynolds number. Note how we pass the floating point type.
Non-zero Dirichlet boundary conditions are specified as plain Julia functions.
julia U = ( T ( 1 ), T ( 0 ))
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (), DirichletBC ()),
+
+ # y bottom, y top
+ ( DirichletBC (), DirichletBC (U)),
+)
We create a two-dimensional domain with a box of size [1, 1]
. The grid is created as a Cartesian product between two vectors. We add a refinement near the walls.
julia n = 32
+lims = T ( 0 ), T ( 1 )
+x = cosine_grid (lims ... , n), cosine_grid (lims ... , n)
+plotgrid (x ... )
We can now build the setup and assemble operators. A 3D setup is built if we also provide a vector of z-coordinates.
julia setup = Setup (; x, boundary_conditions, Re, backend);
+nothing #hide
The initial conditions are provided in function. The value dim()
determines the velocity component.
julia ustart = velocityfield (setup, (dim, x, y) -> zero (x));
+nothing #hide
Iteration processors are called after every nupdate
time steps. This can be useful for logging, plotting, or saving results. Their respective outputs are later returned by solve_unsteady
.
julia processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 50),
+ # ehist = realtimeplotter(; setup, plot = energy_history_plot, nupdate = 10),
+ # espec = realtimeplotter(; setup, plot = energy_spectrum_plot, nupdate = 10),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 100, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 1000 ),
+);
+nothing #hide
By default, a standard fourth order Runge-Kutta method is used. If we don't provide the time step explicitly, an adaptive time step is used.
julia tlims = ( T ( 0 ), T ( 10 ))
+state, outputs = solve_unsteady (; setup, ustart, tlims, Δt = T ( 1e-3 ), processors);
+nothing #hide
Post-process We may visualize or export the computed fields
Export fields to VTK. The file outdir/solution.vti
may be opened for visualization in ParaView . This is particularly useful for inspecting results from 3D simulations.
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Plot pressure
julia fieldplot (state; setup, fieldname = :pressure )
Plot velocity. Note the time stamp used for computing boundary conditions, if any.
julia fieldplot (state; setup, fieldname = :velocitynorm )
Plot vorticity
julia fieldplot (state; setup, fieldname = :vorticity )
In addition, the named tuple outputs
contains quantities from our processors. The logger returns nothing.
julia # outputs.rtp
+# outputs.ehist
+# outputs.espec
+# outputs.anim
+# outputs.vtk
+# outputs.field
+outputs . log
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "LidDrivenCavity2D" )
+
+T = Float32
+# T = Float16
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 1_000 )
+
+U = ( T ( 1 ), T ( 0 ))
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (), DirichletBC ()),
+
+ # y bottom, y top
+ ( DirichletBC (), DirichletBC (U)),
+)
+
+n = 32
+lims = T ( 0 ), T ( 1 )
+x = cosine_grid (lims ... , n), cosine_grid (lims ... , n)
+plotgrid (x ... )
+
+setup = Setup (; x, boundary_conditions, Re, backend);
+
+ustart = velocityfield (setup, (dim, x, y) -> zero (x));
+
+processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 50),
+ # ehist = realtimeplotter(; setup, plot = energy_history_plot, nupdate = 10),
+ # espec = realtimeplotter(; setup, plot = energy_spectrum_plot, nupdate = 10),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 100, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 1000 ),
+);
+
+tlims = ( T ( 0 ), T ( 10 ))
+state, outputs = solve_unsteady (; setup, ustart, tlims, Δt = T ( 1e-3 ), processors);
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+fieldplot (state; setup, fieldname = :pressure )
+
+fieldplot (state; setup, fieldname = :velocitynorm )
+
+fieldplot (state; setup, fieldname = :vorticity )
+
+# outputs.rtp
+# outputs.ehist
+# outputs.espec
+# outputs.anim
+# outputs.vtk
+# outputs.field
+outputs . log
This page was generated using Literate.jl .
`,46)]))}const g=i(l,[["render",p]]);export{o as __pageData,g as default};
diff --git a/previews/PR126/assets/examples_generated_LidDrivenCavity2D.md.D_iNsMnv.lean.js b/previews/PR126/assets/examples_generated_LidDrivenCavity2D.md.D_iNsMnv.lean.js
new file mode 100644
index 00000000..7912e64c
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_LidDrivenCavity2D.md.D_iNsMnv.lean.js
@@ -0,0 +1,91 @@
+import{_ as i,c as a,a5 as n,o as t}from"./chunks/framework.BSoZtefh.js";const o=JSON.parse('{"title":"Tutorial: Lid-Driven Cavity - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/LidDrivenCavity2D.md","filePath":"examples/generated/LidDrivenCavity2D.md","lastUpdated":null}'),l={name:"examples/generated/LidDrivenCavity2D.md"};function p(e,s,h,k,d,r){return t(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Tutorial: Lid-Driven Cavity - 2D In this example we consider a box with a moving lid. The velocity is initially at rest. The solution should reach at steady state equilibrium after a certain time. The same steady state should be obtained when solving a steady state problem.
We start by loading packages. A Makie plotting backend is needed
for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Case name for saving results
julia outdir = joinpath ( @__DIR__ , "output" , "LidDrivenCavity2D" )
The code allows for using different floating point number types, including single precision (Float32
) and double precision (Float64
). On the CPU, the speed is not really different, but double precision uses twice as much memory as single precision. When running on the GPU, single precision is preferred. Half precision (Float16
) is also an option, but then the values should be scaled judiciously to avoid vanishing digits when applying differential operators of the form "right minus left divided by small distance".
Note how floating point type hygiene is enforced in the following using T
to avoid mixing different precisions.
T = Float64
julia T = Float32
+# T = Float16
We can also choose to do the computations on a different device. By default, the computations are performed on the host (CPU). An optional backend
allows for moving arrays to a different device such as a GPU.
Note: For GPUs, single precision is preferred.
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Here we choose a moderate Reynolds number. Note how we pass the floating point type.
Non-zero Dirichlet boundary conditions are specified as plain Julia functions.
julia U = ( T ( 1 ), T ( 0 ))
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (), DirichletBC ()),
+
+ # y bottom, y top
+ ( DirichletBC (), DirichletBC (U)),
+)
We create a two-dimensional domain with a box of size [1, 1]
. The grid is created as a Cartesian product between two vectors. We add a refinement near the walls.
julia n = 32
+lims = T ( 0 ), T ( 1 )
+x = cosine_grid (lims ... , n), cosine_grid (lims ... , n)
+plotgrid (x ... )
We can now build the setup and assemble operators. A 3D setup is built if we also provide a vector of z-coordinates.
julia setup = Setup (; x, boundary_conditions, Re, backend);
+nothing #hide
The initial conditions are provided in function. The value dim()
determines the velocity component.
julia ustart = velocityfield (setup, (dim, x, y) -> zero (x));
+nothing #hide
Iteration processors are called after every nupdate
time steps. This can be useful for logging, plotting, or saving results. Their respective outputs are later returned by solve_unsteady
.
julia processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 50),
+ # ehist = realtimeplotter(; setup, plot = energy_history_plot, nupdate = 10),
+ # espec = realtimeplotter(; setup, plot = energy_spectrum_plot, nupdate = 10),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 100, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 1000 ),
+);
+nothing #hide
By default, a standard fourth order Runge-Kutta method is used. If we don't provide the time step explicitly, an adaptive time step is used.
julia tlims = ( T ( 0 ), T ( 10 ))
+state, outputs = solve_unsteady (; setup, ustart, tlims, Δt = T ( 1e-3 ), processors);
+nothing #hide
Post-process We may visualize or export the computed fields
Export fields to VTK. The file outdir/solution.vti
may be opened for visualization in ParaView . This is particularly useful for inspecting results from 3D simulations.
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Plot pressure
julia fieldplot (state; setup, fieldname = :pressure )
Plot velocity. Note the time stamp used for computing boundary conditions, if any.
julia fieldplot (state; setup, fieldname = :velocitynorm )
Plot vorticity
julia fieldplot (state; setup, fieldname = :vorticity )
In addition, the named tuple outputs
contains quantities from our processors. The logger returns nothing.
julia # outputs.rtp
+# outputs.ehist
+# outputs.espec
+# outputs.anim
+# outputs.vtk
+# outputs.field
+outputs . log
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "LidDrivenCavity2D" )
+
+T = Float32
+# T = Float16
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 1_000 )
+
+U = ( T ( 1 ), T ( 0 ))
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (), DirichletBC ()),
+
+ # y bottom, y top
+ ( DirichletBC (), DirichletBC (U)),
+)
+
+n = 32
+lims = T ( 0 ), T ( 1 )
+x = cosine_grid (lims ... , n), cosine_grid (lims ... , n)
+plotgrid (x ... )
+
+setup = Setup (; x, boundary_conditions, Re, backend);
+
+ustart = velocityfield (setup, (dim, x, y) -> zero (x));
+
+processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 50),
+ # ehist = realtimeplotter(; setup, plot = energy_history_plot, nupdate = 10),
+ # espec = realtimeplotter(; setup, plot = energy_spectrum_plot, nupdate = 10),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 100, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 1000 ),
+);
+
+tlims = ( T ( 0 ), T ( 10 ))
+state, outputs = solve_unsteady (; setup, ustart, tlims, Δt = T ( 1e-3 ), processors);
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+fieldplot (state; setup, fieldname = :pressure )
+
+fieldplot (state; setup, fieldname = :velocitynorm )
+
+fieldplot (state; setup, fieldname = :vorticity )
+
+# outputs.rtp
+# outputs.ehist
+# outputs.espec
+# outputs.anim
+# outputs.vtk
+# outputs.field
+outputs . log
This page was generated using Literate.jl .
`,46)]))}const g=i(l,[["render",p]]);export{o as __pageData,g as default};
diff --git a/previews/PR126/assets/examples_generated_LidDrivenCavity3D.md.CXnvIfHv.js b/previews/PR126/assets/examples_generated_LidDrivenCavity3D.md.CXnvIfHv.js
new file mode 100644
index 00000000..fd58d55b
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_LidDrivenCavity3D.md.CXnvIfHv.js
@@ -0,0 +1,79 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Lid-Driven Cavity - 3D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/LidDrivenCavity3D.md","filePath":"examples/generated/LidDrivenCavity3D.md","lastUpdated":null}'),t={name:"examples/generated/LidDrivenCavity3D.md"};function p(l,s,k,e,E,d){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Lid-Driven Cavity - 3D In this example we consider a box with a moving lid. The velocity is initially at rest. The solution should reach at steady state equilibrium after a certain time. The same steady state should be obtained when solving a steady state problem.
julia using CairoMakie
+using IncompressibleNavierStokes
Case name for saving results
julia outdir = joinpath ( @__DIR__ , "output" , "LidDrivenCavity3D" )
Floating point type
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Reynolds number
A 3D grid is a Cartesian product of three vectors. Here we refine the grid near the walls.
julia x = cosine_grid ( T ( 0 ), T ( 1 ), 25 ), cosine_grid ( T ( 0 ), T ( 1 ), 25 ), LinRange ( - T ( 0.2 ), T ( 0.2 ), 11 )
+plotgrid (x ... )
Boundary conditions: horizontal movement of the top lid
julia U = ( T ( 1 ), T ( 1 / 5 ), T ( 0 ))
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (), DirichletBC ()),
+
+ # y rear, y front
+ ( DirichletBC (), DirichletBC (U)),
+
+ # z bottom, z top
+ ( PeriodicBC (), PeriodicBC ()),
+)
Build setup and assemble operators
julia setup = Setup (; x, Re, boundary_conditions, backend);
+nothing #hide
Initial conditions
julia ustart = velocityfield (setup, (dim, x, y, z) -> zero (x))
Solve unsteady problem
julia (; u, t), outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 0.2 )),
+ Δt = T ( 1e-3 ),
+ processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 50),
+ ehist = realtimeplotter (; setup, plot = energy_history_plot, nupdate = 10 ),
+ # espec = realtimeplotter(; setup, plot = energy_spectrum_plot, nupdate = 10),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 100, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 20 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Energy history
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "LidDrivenCavity3D" )
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 1_000 )
+
+x = cosine_grid ( T ( 0 ), T ( 1 ), 25 ), cosine_grid ( T ( 0 ), T ( 1 ), 25 ), LinRange ( - T ( 0.2 ), T ( 0.2 ), 11 )
+plotgrid (x ... )
+
+U = ( T ( 1 ), T ( 1 / 5 ), T ( 0 ))
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (), DirichletBC ()),
+
+ # y rear, y front
+ ( DirichletBC (), DirichletBC (U)),
+
+ # z bottom, z top
+ ( PeriodicBC (), PeriodicBC ()),
+)
+
+setup = Setup (; x, Re, boundary_conditions, backend);
+
+ustart = velocityfield (setup, (dim, x, y, z) -> zero (x))
+
+(; u, t), outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 0.2 )),
+ Δt = T ( 1e-3 ),
+ processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 50),
+ ehist = realtimeplotter (; setup, plot = energy_history_plot, nupdate = 10 ),
+ # espec = realtimeplotter(; setup, plot = energy_spectrum_plot, nupdate = 10),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 100, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 20 ),
+ ),
+);
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+outputs . ehist
This page was generated using Literate.jl .
`,33)]))}const y=i(t,[["render",p]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_LidDrivenCavity3D.md.CXnvIfHv.lean.js b/previews/PR126/assets/examples_generated_LidDrivenCavity3D.md.CXnvIfHv.lean.js
new file mode 100644
index 00000000..fd58d55b
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_LidDrivenCavity3D.md.CXnvIfHv.lean.js
@@ -0,0 +1,79 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Lid-Driven Cavity - 3D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/LidDrivenCavity3D.md","filePath":"examples/generated/LidDrivenCavity3D.md","lastUpdated":null}'),t={name:"examples/generated/LidDrivenCavity3D.md"};function p(l,s,k,e,E,d){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Lid-Driven Cavity - 3D In this example we consider a box with a moving lid. The velocity is initially at rest. The solution should reach at steady state equilibrium after a certain time. The same steady state should be obtained when solving a steady state problem.
julia using CairoMakie
+using IncompressibleNavierStokes
Case name for saving results
julia outdir = joinpath ( @__DIR__ , "output" , "LidDrivenCavity3D" )
Floating point type
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Reynolds number
A 3D grid is a Cartesian product of three vectors. Here we refine the grid near the walls.
julia x = cosine_grid ( T ( 0 ), T ( 1 ), 25 ), cosine_grid ( T ( 0 ), T ( 1 ), 25 ), LinRange ( - T ( 0.2 ), T ( 0.2 ), 11 )
+plotgrid (x ... )
Boundary conditions: horizontal movement of the top lid
julia U = ( T ( 1 ), T ( 1 / 5 ), T ( 0 ))
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (), DirichletBC ()),
+
+ # y rear, y front
+ ( DirichletBC (), DirichletBC (U)),
+
+ # z bottom, z top
+ ( PeriodicBC (), PeriodicBC ()),
+)
Build setup and assemble operators
julia setup = Setup (; x, Re, boundary_conditions, backend);
+nothing #hide
Initial conditions
julia ustart = velocityfield (setup, (dim, x, y, z) -> zero (x))
Solve unsteady problem
julia (; u, t), outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 0.2 )),
+ Δt = T ( 1e-3 ),
+ processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 50),
+ ehist = realtimeplotter (; setup, plot = energy_history_plot, nupdate = 10 ),
+ # espec = realtimeplotter(; setup, plot = energy_spectrum_plot, nupdate = 10),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 100, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 20 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Energy history
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "LidDrivenCavity3D" )
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 1_000 )
+
+x = cosine_grid ( T ( 0 ), T ( 1 ), 25 ), cosine_grid ( T ( 0 ), T ( 1 ), 25 ), LinRange ( - T ( 0.2 ), T ( 0.2 ), 11 )
+plotgrid (x ... )
+
+U = ( T ( 1 ), T ( 1 / 5 ), T ( 0 ))
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (), DirichletBC ()),
+
+ # y rear, y front
+ ( DirichletBC (), DirichletBC (U)),
+
+ # z bottom, z top
+ ( PeriodicBC (), PeriodicBC ()),
+)
+
+setup = Setup (; x, Re, boundary_conditions, backend);
+
+ustart = velocityfield (setup, (dim, x, y, z) -> zero (x))
+
+(; u, t), outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 0.2 )),
+ Δt = T ( 1e-3 ),
+ processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 50),
+ ehist = realtimeplotter (; setup, plot = energy_history_plot, nupdate = 10 ),
+ # espec = realtimeplotter(; setup, plot = energy_spectrum_plot, nupdate = 10),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 100, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 20 ),
+ ),
+);
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+outputs . ehist
This page was generated using Literate.jl .
`,33)]))}const y=i(t,[["render",p]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_MultiActuator.md.DeF4XHSW.js b/previews/PR126/assets/examples_generated_MultiActuator.md.DeF4XHSW.js
new file mode 100644
index 00000000..c9244c80
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_MultiActuator.md.DeF4XHSW.js
@@ -0,0 +1,193 @@
+import{_ as i,c as a,a5 as h,o as n}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Unsteady actuator case - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/MultiActuator.md","filePath":"examples/generated/MultiActuator.md","lastUpdated":null}'),k={name:"examples/generated/MultiActuator.md"};function p(l,s,t,e,E,d){return n(),a("div",null,s[0]||(s[0]=[h(`Note: Output is not generated for this example (to save resources on GitHub).
Unsteady actuator case - 2D In this example, an unsteady inlet velocity profile at encounters a wind turbine blade in a wall-less domain. The blade is modeled as a uniform body force on a thin rectangle.
julia using CairoMakie
+using IncompressibleNavierStokes
+using Random
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "MultiActuator" )
Floating point precision
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Boundary conditions
julia boundary_conditions = (
+ # x left, x right
+ (
+ DirichletBC ((dim, x, y, t) -> sinpi ( sinpi (t / 6 ) / 6 + one (x) / 2 * (dim == 1 ))),
+ PressureBC (),
+ ),
+
+ # y rear, y front
+ ( PressureBC (), PressureBC ()),
+)
Actuator body force: A thrust coefficient Cₜ
distributed over a thin rectangle
julia create_bodyforce (; xc, yc, D, δ, C) =
+ (dim, x, y, t) ->
+ dim == 1 && abs (x - xc) ≤ δ / 2 && abs (y - yc) ≤ D / 2 ? - C / (D * δ) : zero (x)
+
+create_manyforce (forces ... ) = function (dim, x, y, t)
+ out = zero (x)
+ for f in forces
+ out += f (dim, x, y, t)
+ end
+ out
+end
+
+disk = (; D = T ( 1 ), δ = T ( 0.11 ), C = T ( 0.2 ))
+bodyforce = create_manyforce (
+ create_bodyforce (; xc = T ( 2 ), yc = T ( 0 ), disk ... ),
+ create_bodyforce (; xc = T ( 4 ), yc = T ( 0.7 ), disk ... ),
+ create_bodyforce (; xc = T ( 6.4 ), yc = T ( - 1 ), disk ... ),
+)
A 2D grid is a Cartesian product of two vectors
julia n = 50
+x = LinRange ( T ( 0 ), T ( 10 ), 5 n + 1 ), LinRange ( - T ( 2 ), T ( 2 ), 2 n + 1 )
+plotgrid (x ... ; figure = (; size = ( 600 , 300 )))
Build setup and assemble operators
julia setup = Setup (;
+ x,
+ Re = T ( 1000 ),
+ boundary_conditions,
+ bodyforce,
+ issteadybodyforce = true ,
+ backend,
+);
+nothing #hide
Initial conditions (extend inflow)
julia ustart = velocityfield (setup, (dim, x, y) -> dim == 1 ? one (x) : zero (x));
+t = T ( 0 )
+
+boxes = map (bodyforce . forces) do (; xc, yc, D, δ)
+ [
+ Point2f (xc - δ / 2 , yc + D / 2 ),
+ Point2f (xc - δ / 2 , yc - D / 2 ),
+ Point2f (xc + δ / 2 , yc - D / 2 ),
+ Point2f (xc + δ / 2 , yc + D / 2 ),
+ Point2f (xc - δ / 2 , yc + D / 2 ),
+ ]
+end
+box = boxes[ 1 ]
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 12 )),
+ method = RKMethods . RK44P2 (),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ # plot = fieldplot,
+ # fieldname = :velocitynorm,
+ # fieldname = :pressure,
+ size = ( 600 , 300 ),
+ nupdate = 1 ,
+ ),
+ boxplotter = processor () do state
+ for box in boxes
+ lines! ( current_axis (), box; color = :red )
+ end
+ end ,
+ # ehist = realtimeplotter(; setup, plot = energy_history_plot, nupdate = 1),
+ # espec = realtimeplotter(; setup, plot = energy_spectrum_plot, nupdate = 1),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = "$outdir", filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields (u, p)
.
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Plot pressure
julia fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :pressure )
+lines! .(boxes; color = :red );
+fig
Plot velocity
julia fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :velocitynorm )
+lines! .(boxes; color = :red );
+fig
Plot vorticity
julia fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :vorticity )
+lines! .(boxes; color = :red );
+fig
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+using Random
+
+outdir = joinpath ( @__DIR__ , "output" , "MultiActuator" )
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+boundary_conditions = (
+ # x left, x right
+ (
+ DirichletBC ((dim, x, y, t) -> sinpi ( sinpi (t / 6 ) / 6 + one (x) / 2 * (dim == 1 ))),
+ PressureBC (),
+ ),
+
+ # y rear, y front
+ ( PressureBC (), PressureBC ()),
+)
+
+create_bodyforce (; xc, yc, D, δ, C) =
+ (dim, x, y, t) ->
+ dim == 1 && abs (x - xc) ≤ δ / 2 && abs (y - yc) ≤ D / 2 ? - C / (D * δ) : zero (x)
+
+create_manyforce (forces ... ) = function (dim, x, y, t)
+ out = zero (x)
+ for f in forces
+ out += f (dim, x, y, t)
+ end
+ out
+end
+
+disk = (; D = T ( 1 ), δ = T ( 0.11 ), C = T ( 0.2 ))
+bodyforce = create_manyforce (
+ create_bodyforce (; xc = T ( 2 ), yc = T ( 0 ), disk ... ),
+ create_bodyforce (; xc = T ( 4 ), yc = T ( 0.7 ), disk ... ),
+ create_bodyforce (; xc = T ( 6.4 ), yc = T ( - 1 ), disk ... ),
+)
+
+n = 50
+x = LinRange ( T ( 0 ), T ( 10 ), 5 n + 1 ), LinRange ( - T ( 2 ), T ( 2 ), 2 n + 1 )
+plotgrid (x ... ; figure = (; size = ( 600 , 300 )))
+
+setup = Setup (;
+ x,
+ Re = T ( 1000 ),
+ boundary_conditions,
+ bodyforce,
+ issteadybodyforce = true ,
+ backend,
+);
+
+ustart = velocityfield (setup, (dim, x, y) -> dim == 1 ? one (x) : zero (x));
+t = T ( 0 )
+
+boxes = map (bodyforce . forces) do (; xc, yc, D, δ)
+ [
+ Point2f (xc - δ / 2 , yc + D / 2 ),
+ Point2f (xc - δ / 2 , yc - D / 2 ),
+ Point2f (xc + δ / 2 , yc - D / 2 ),
+ Point2f (xc + δ / 2 , yc + D / 2 ),
+ Point2f (xc - δ / 2 , yc + D / 2 ),
+ ]
+end
+box = boxes[ 1 ]
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 12 )),
+ method = RKMethods . RK44P2 (),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ # plot = fieldplot,
+ # fieldname = :velocitynorm,
+ # fieldname = :pressure,
+ size = ( 600 , 300 ),
+ nupdate = 1 ,
+ ),
+ boxplotter = processor () do state
+ for box in boxes
+ lines! ( current_axis (), box; color = :red )
+ end
+ end ,
+ # ehist = realtimeplotter(; setup, plot = energy_history_plot, nupdate = 1),
+ # espec = realtimeplotter(; setup, plot = energy_spectrum_plot, nupdate = 1),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = "$outdir", filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :pressure )
+lines! .(boxes; color = :red );
+fig
+
+fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :velocitynorm )
+lines! .(boxes; color = :red );
+fig
+
+fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :vorticity )
+lines! .(boxes; color = :red );
+fig
This page was generated using Literate.jl .
`,37)]))}const y=i(k,[["render",p]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_MultiActuator.md.DeF4XHSW.lean.js b/previews/PR126/assets/examples_generated_MultiActuator.md.DeF4XHSW.lean.js
new file mode 100644
index 00000000..c9244c80
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_MultiActuator.md.DeF4XHSW.lean.js
@@ -0,0 +1,193 @@
+import{_ as i,c as a,a5 as h,o as n}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Unsteady actuator case - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/MultiActuator.md","filePath":"examples/generated/MultiActuator.md","lastUpdated":null}'),k={name:"examples/generated/MultiActuator.md"};function p(l,s,t,e,E,d){return n(),a("div",null,s[0]||(s[0]=[h(`Note: Output is not generated for this example (to save resources on GitHub).
Unsteady actuator case - 2D In this example, an unsteady inlet velocity profile at encounters a wind turbine blade in a wall-less domain. The blade is modeled as a uniform body force on a thin rectangle.
julia using CairoMakie
+using IncompressibleNavierStokes
+using Random
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "MultiActuator" )
Floating point precision
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Boundary conditions
julia boundary_conditions = (
+ # x left, x right
+ (
+ DirichletBC ((dim, x, y, t) -> sinpi ( sinpi (t / 6 ) / 6 + one (x) / 2 * (dim == 1 ))),
+ PressureBC (),
+ ),
+
+ # y rear, y front
+ ( PressureBC (), PressureBC ()),
+)
Actuator body force: A thrust coefficient Cₜ
distributed over a thin rectangle
julia create_bodyforce (; xc, yc, D, δ, C) =
+ (dim, x, y, t) ->
+ dim == 1 && abs (x - xc) ≤ δ / 2 && abs (y - yc) ≤ D / 2 ? - C / (D * δ) : zero (x)
+
+create_manyforce (forces ... ) = function (dim, x, y, t)
+ out = zero (x)
+ for f in forces
+ out += f (dim, x, y, t)
+ end
+ out
+end
+
+disk = (; D = T ( 1 ), δ = T ( 0.11 ), C = T ( 0.2 ))
+bodyforce = create_manyforce (
+ create_bodyforce (; xc = T ( 2 ), yc = T ( 0 ), disk ... ),
+ create_bodyforce (; xc = T ( 4 ), yc = T ( 0.7 ), disk ... ),
+ create_bodyforce (; xc = T ( 6.4 ), yc = T ( - 1 ), disk ... ),
+)
A 2D grid is a Cartesian product of two vectors
julia n = 50
+x = LinRange ( T ( 0 ), T ( 10 ), 5 n + 1 ), LinRange ( - T ( 2 ), T ( 2 ), 2 n + 1 )
+plotgrid (x ... ; figure = (; size = ( 600 , 300 )))
Build setup and assemble operators
julia setup = Setup (;
+ x,
+ Re = T ( 1000 ),
+ boundary_conditions,
+ bodyforce,
+ issteadybodyforce = true ,
+ backend,
+);
+nothing #hide
Initial conditions (extend inflow)
julia ustart = velocityfield (setup, (dim, x, y) -> dim == 1 ? one (x) : zero (x));
+t = T ( 0 )
+
+boxes = map (bodyforce . forces) do (; xc, yc, D, δ)
+ [
+ Point2f (xc - δ / 2 , yc + D / 2 ),
+ Point2f (xc - δ / 2 , yc - D / 2 ),
+ Point2f (xc + δ / 2 , yc - D / 2 ),
+ Point2f (xc + δ / 2 , yc + D / 2 ),
+ Point2f (xc - δ / 2 , yc + D / 2 ),
+ ]
+end
+box = boxes[ 1 ]
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 12 )),
+ method = RKMethods . RK44P2 (),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ # plot = fieldplot,
+ # fieldname = :velocitynorm,
+ # fieldname = :pressure,
+ size = ( 600 , 300 ),
+ nupdate = 1 ,
+ ),
+ boxplotter = processor () do state
+ for box in boxes
+ lines! ( current_axis (), box; color = :red )
+ end
+ end ,
+ # ehist = realtimeplotter(; setup, plot = energy_history_plot, nupdate = 1),
+ # espec = realtimeplotter(; setup, plot = energy_spectrum_plot, nupdate = 1),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = "$outdir", filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields (u, p)
.
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Plot pressure
julia fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :pressure )
+lines! .(boxes; color = :red );
+fig
Plot velocity
julia fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :velocitynorm )
+lines! .(boxes; color = :red );
+fig
Plot vorticity
julia fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :vorticity )
+lines! .(boxes; color = :red );
+fig
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+using Random
+
+outdir = joinpath ( @__DIR__ , "output" , "MultiActuator" )
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+boundary_conditions = (
+ # x left, x right
+ (
+ DirichletBC ((dim, x, y, t) -> sinpi ( sinpi (t / 6 ) / 6 + one (x) / 2 * (dim == 1 ))),
+ PressureBC (),
+ ),
+
+ # y rear, y front
+ ( PressureBC (), PressureBC ()),
+)
+
+create_bodyforce (; xc, yc, D, δ, C) =
+ (dim, x, y, t) ->
+ dim == 1 && abs (x - xc) ≤ δ / 2 && abs (y - yc) ≤ D / 2 ? - C / (D * δ) : zero (x)
+
+create_manyforce (forces ... ) = function (dim, x, y, t)
+ out = zero (x)
+ for f in forces
+ out += f (dim, x, y, t)
+ end
+ out
+end
+
+disk = (; D = T ( 1 ), δ = T ( 0.11 ), C = T ( 0.2 ))
+bodyforce = create_manyforce (
+ create_bodyforce (; xc = T ( 2 ), yc = T ( 0 ), disk ... ),
+ create_bodyforce (; xc = T ( 4 ), yc = T ( 0.7 ), disk ... ),
+ create_bodyforce (; xc = T ( 6.4 ), yc = T ( - 1 ), disk ... ),
+)
+
+n = 50
+x = LinRange ( T ( 0 ), T ( 10 ), 5 n + 1 ), LinRange ( - T ( 2 ), T ( 2 ), 2 n + 1 )
+plotgrid (x ... ; figure = (; size = ( 600 , 300 )))
+
+setup = Setup (;
+ x,
+ Re = T ( 1000 ),
+ boundary_conditions,
+ bodyforce,
+ issteadybodyforce = true ,
+ backend,
+);
+
+ustart = velocityfield (setup, (dim, x, y) -> dim == 1 ? one (x) : zero (x));
+t = T ( 0 )
+
+boxes = map (bodyforce . forces) do (; xc, yc, D, δ)
+ [
+ Point2f (xc - δ / 2 , yc + D / 2 ),
+ Point2f (xc - δ / 2 , yc - D / 2 ),
+ Point2f (xc + δ / 2 , yc - D / 2 ),
+ Point2f (xc + δ / 2 , yc + D / 2 ),
+ Point2f (xc - δ / 2 , yc + D / 2 ),
+ ]
+end
+box = boxes[ 1 ]
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 12 )),
+ method = RKMethods . RK44P2 (),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ # plot = fieldplot,
+ # fieldname = :velocitynorm,
+ # fieldname = :pressure,
+ size = ( 600 , 300 ),
+ nupdate = 1 ,
+ ),
+ boxplotter = processor () do state
+ for box in boxes
+ lines! ( current_axis (), box; color = :red )
+ end
+ end ,
+ # ehist = realtimeplotter(; setup, plot = energy_history_plot, nupdate = 1),
+ # espec = realtimeplotter(; setup, plot = energy_spectrum_plot, nupdate = 1),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = "$outdir", filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :pressure )
+lines! .(boxes; color = :red );
+fig
+
+fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :velocitynorm )
+lines! .(boxes; color = :red );
+fig
+
+fig = fieldplot (state; setup, size = ( 600 , 300 ), fieldname = :vorticity )
+lines! .(boxes; color = :red );
+fig
This page was generated using Literate.jl .
`,37)]))}const y=i(k,[["render",p]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_PlanarMixing2D.md.DlU0y6-e.js b/previews/PR126/assets/examples_generated_PlanarMixing2D.md.DlU0y6-e.js
new file mode 100644
index 00000000..225afe90
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_PlanarMixing2D.md.DlU0y6-e.js
@@ -0,0 +1,106 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Planar mixing - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/PlanarMixing2D.md","filePath":"examples/generated/PlanarMixing2D.md","lastUpdated":null}'),k={name:"examples/generated/PlanarMixing2D.md"};function p(l,s,t,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Planar mixing - 2D Planar mixing example, as presented in [3 ].
We start by loading packages. A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "PlanarMixing2D" )
Viscosity model
Boundary conditions
julia ΔU = 1.0
+Ubar = 1.0
+ϵ = ( 0.082 Ubar, 0.012 Ubar)
+n = ( 0.4π , 0.3π )
+ω = ( 0.22 , 0.11 )
+U (dim, x, y, t) =
+ dim == 1 ?
+ 1.0 + ΔU / 2 * tanh ( 2 y) + sum ( @. ϵ * ( 1 - tanh (y / 2 ) ^ 2 ) * cos (n * y) * sin (ω * t)) :
+ 0.0
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (U), PressureBC ()),
+
+ # y rear, y front
+ ( PressureBC (), PressureBC ()),
+)
A 2D grid is a Cartesian product of two vectors
julia n = 64
+# n = 256
+x = LinRange ( 0.0 , 256.0 , 4 n), LinRange ( - 32.0 , 32.0 , n)
+plotgrid (x ... ; figure = (; size = ( 600 , 250 )))
Build setup and assemble operators
julia setup = Setup (; x, Re, boundary_conditions);
+psolver = psolver_direct (setup);
+nothing #hide
Initial conditions (extend inflow)
julia ustart = velocityfield (setup, (dim, x, y) -> U (dim, x, y, 0.0 ); psolver);
+nothing #hide
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 100.0 ),
+ psolver,
+ method = RKMethods . RK44P2 (),
+ # Δt = 0.1,
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ docolorbar = false ,
+ size = ( 600 , 250 ),
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields (u, p)
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ), psolver)
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "PlanarMixing2D" )
+
+Re = 500.0
+
+ΔU = 1.0
+Ubar = 1.0
+ϵ = ( 0.082 Ubar, 0.012 Ubar)
+n = ( 0.4π , 0.3π )
+ω = ( 0.22 , 0.11 )
+U (dim, x, y, t) =
+ dim == 1 ?
+ 1.0 + ΔU / 2 * tanh ( 2 y) + sum ( @. ϵ * ( 1 - tanh (y / 2 ) ^ 2 ) * cos (n * y) * sin (ω * t)) :
+ 0.0
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (U), PressureBC ()),
+
+ # y rear, y front
+ ( PressureBC (), PressureBC ()),
+)
+
+n = 64
+# n = 256
+x = LinRange ( 0.0 , 256.0 , 4 n), LinRange ( - 32.0 , 32.0 , n)
+plotgrid (x ... ; figure = (; size = ( 600 , 250 )))
+
+setup = Setup (; x, Re, boundary_conditions);
+psolver = psolver_direct (setup);
+
+ustart = velocityfield (setup, (dim, x, y) -> U (dim, x, y, 0.0 ); psolver);
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 100.0 ),
+ psolver,
+ method = RKMethods . RK44P2 (),
+ # Δt = 0.1,
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ docolorbar = false ,
+ size = ( 600 , 250 ),
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+outputs . rtp
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ), psolver)
This page was generated using Literate.jl .
`,29)]))}const y=i(k,[["render",p]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_PlanarMixing2D.md.DlU0y6-e.lean.js b/previews/PR126/assets/examples_generated_PlanarMixing2D.md.DlU0y6-e.lean.js
new file mode 100644
index 00000000..225afe90
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_PlanarMixing2D.md.DlU0y6-e.lean.js
@@ -0,0 +1,106 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Planar mixing - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/PlanarMixing2D.md","filePath":"examples/generated/PlanarMixing2D.md","lastUpdated":null}'),k={name:"examples/generated/PlanarMixing2D.md"};function p(l,s,t,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Planar mixing - 2D Planar mixing example, as presented in [3 ].
We start by loading packages. A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "PlanarMixing2D" )
Viscosity model
Boundary conditions
julia ΔU = 1.0
+Ubar = 1.0
+ϵ = ( 0.082 Ubar, 0.012 Ubar)
+n = ( 0.4π , 0.3π )
+ω = ( 0.22 , 0.11 )
+U (dim, x, y, t) =
+ dim == 1 ?
+ 1.0 + ΔU / 2 * tanh ( 2 y) + sum ( @. ϵ * ( 1 - tanh (y / 2 ) ^ 2 ) * cos (n * y) * sin (ω * t)) :
+ 0.0
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (U), PressureBC ()),
+
+ # y rear, y front
+ ( PressureBC (), PressureBC ()),
+)
A 2D grid is a Cartesian product of two vectors
julia n = 64
+# n = 256
+x = LinRange ( 0.0 , 256.0 , 4 n), LinRange ( - 32.0 , 32.0 , n)
+plotgrid (x ... ; figure = (; size = ( 600 , 250 )))
Build setup and assemble operators
julia setup = Setup (; x, Re, boundary_conditions);
+psolver = psolver_direct (setup);
+nothing #hide
Initial conditions (extend inflow)
julia ustart = velocityfield (setup, (dim, x, y) -> U (dim, x, y, 0.0 ); psolver);
+nothing #hide
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 100.0 ),
+ psolver,
+ method = RKMethods . RK44P2 (),
+ # Δt = 0.1,
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ docolorbar = false ,
+ size = ( 600 , 250 ),
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields (u, p)
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ), psolver)
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "PlanarMixing2D" )
+
+Re = 500.0
+
+ΔU = 1.0
+Ubar = 1.0
+ϵ = ( 0.082 Ubar, 0.012 Ubar)
+n = ( 0.4π , 0.3π )
+ω = ( 0.22 , 0.11 )
+U (dim, x, y, t) =
+ dim == 1 ?
+ 1.0 + ΔU / 2 * tanh ( 2 y) + sum ( @. ϵ * ( 1 - tanh (y / 2 ) ^ 2 ) * cos (n * y) * sin (ω * t)) :
+ 0.0
+boundary_conditions = (
+ # x left, x right
+ ( DirichletBC (U), PressureBC ()),
+
+ # y rear, y front
+ ( PressureBC (), PressureBC ()),
+)
+
+n = 64
+# n = 256
+x = LinRange ( 0.0 , 256.0 , 4 n), LinRange ( - 32.0 , 32.0 , n)
+plotgrid (x ... ; figure = (; size = ( 600 , 250 )))
+
+setup = Setup (; x, Re, boundary_conditions);
+psolver = psolver_direct (setup);
+
+ustart = velocityfield (setup, (dim, x, y) -> U (dim, x, y, 0.0 ); psolver);
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( 0.0 , 100.0 ),
+ psolver,
+ method = RKMethods . RK44P2 (),
+ # Δt = 0.1,
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ docolorbar = false ,
+ size = ( 600 , 250 ),
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+outputs . rtp
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ), psolver)
This page was generated using Literate.jl .
`,29)]))}const y=i(k,[["render",p]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_PlaneJets2D.md.Cxpw6Mt8.js b/previews/PR126/assets/examples_generated_PlaneJets2D.md.Cxpw6Mt8.js
new file mode 100644
index 00000000..b5f02751
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_PlaneJets2D.md.Cxpw6Mt8.js
@@ -0,0 +1,273 @@
+import{_ as i,c as a,a5 as h,o as k}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Plane jets - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/PlaneJets2D.md","filePath":"examples/generated/PlaneJets2D.md","lastUpdated":null}'),n={name:"examples/generated/PlaneJets2D.md"};function l(p,s,t,e,E,d){return k(),a("div",null,s[0]||(s[0]=[h(`Note: Output is not generated for this example (to save resources on GitHub).
Plane jets - 2D Plane jets example, as presented in [4 ]. Note that the original formulation is in 3D.
We start by loading packages. A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using FFTW
+using CairoMakie
+using IncompressibleNavierStokes
+using LaTeXStrings
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "PlaneJets2D" )
Floating point type
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Reynolds number
Test cases (A, B, C, D; in order)
julia # V() = sqrt(T(467.4))
+V () = T ( 21.619435700313733 )
+
+U_A (y) = V () / 2 * ( tanh ((y + T ( 0.5 )) / T ( 0.1 )) - tanh ((y - T ( 0.5 )) / T ( 0.1 )))
+
+U_B (y) =
+ V () / 2 * ( tanh ((y + 1 + T ( 0.5 )) / T ( 0.1 )) - tanh ((y + 1 - T ( 0.5 )) / T ( 0.1 ))) +
+ V () / 2 * ( tanh ((y - 1 + T ( 0.5 )) / T ( 0.1 )) - tanh ((y - 1 - T ( 0.5 )) / T ( 0.1 )))
+
+U_C (y) =
+ V () / 2 * (
+ tanh (((y + T ( 1.0 )) / 1 + T ( 0.5 )) / T ( 0.1 )) -
+ tanh (((y + T ( 1.0 )) / 1 - T ( 0.5 )) / T ( 0.1 ))
+ ) +
+ V () / 4 * (
+ tanh (((y - T ( 1.5 )) / 2 + T ( 0.5 )) / T ( 0.2 )) -
+ tanh (((y - T ( 1.5 )) / 2 - T ( 0.5 )) / T ( 0.2 ))
+ )
+
+U_D (y) =
+ V () / 2 * (
+ tanh (((y + T ( 1.0 )) / 1 + T ( 0.5 )) / T ( 0.1 )) -
+ tanh (((y + T ( 1.0 )) / 1 - T ( 0.5 )) / T ( 0.1 ))
+ ) -
+ V () / 4 * (
+ tanh (((y - T ( 1.5 )) / 2 + T ( 0.5 )) / T ( 0.2 )) -
+ tanh (((y - T ( 1.5 )) / 2 - T ( 0.5 )) / T ( 0.2 ))
+ )
+
+# U(y) = U_A(y)
+# U(y) = U_B(y)
+U (y) = U_C (y)
+# U(y) = U_D(y)
Random noise to stimulate turbulence
julia U (x, y) = ( 1 + T ( 0.1 ) * ( rand (T) - T ( 0.5 ))) * U (y)
+
+# boundary_conditions = (
+# (PeriodicBC(), PeriodicBC()),
+# (PressureBC(), PressureBC())
+# )
A 2D grid is a Cartesian product of two vectors
julia n = 64
+# n = 128
+# n = 256
+x = LinRange ( T ( 0 ), T ( 16 ), 4 n + 1 ), LinRange ( - T ( 10 ), T ( 10 ), 5 n + 1 )
+plotgrid (x ... )
Build setup and assemble operators
julia setup = Setup (x, Re, backend);
+# setup = Setup(; x, Re, boundary_conditions, backend);
Initial conditions
julia ustart = velocityfield (setup, (dim, x, y) -> dim == 1 ? U (x, y) : zero (x));
+nothing #hide
Real time plot: Streamwise average and spectrum
julia function meanplot (state; setup)
+ (; xp, Iu, Ip, Nu, N) = setup . grid
+
+ umean = lift (state) do (; u, p, t)
+ reshape ( sum (u[ 1 ][Iu[ 1 ]]; dims = 1 ), :) ./ Nu[ 1 ][ 1 ] ./ V ()
+ end
+
+ K = Nu[ 1 ][ 2 ] ÷ 2
+ k = 1 : (K - 1 )
+
+ # Find energy spectrum where y = 0
+ n₀ = findmin (abs, xp[ 2 ])[ 2 ]
+ E₀ = lift (state) do (; u, p, t)
+ u_y = u[ 1 ][:, n₀]
+ abs .( fft (u_y .^ 2 ))[k .+ 1 ]
+ end
+ y₀ = xp[ 2 ][n₀]
+
+ # Find energy spectrum where y = 1
+ n₁ = findmin (y -> abs (y - 1 ), xp[ 2 ])[ 2 ]
+ E₁ = lift (state) do (; u, p, t)
+ u_y = u[ 1 ][:, n₁]
+ abs .( fft (u_y .^ 2 ))[k .+ 1 ]
+ end
+ y₁ = xp[ 2 ][n₁]
+
+ fig = Figure ()
+ ax = Axis (
+ fig[ 1 , 1 ];
+ title = "Mean streamwise flow" ,
+ xlabel = "y" ,
+ ylabel = L " \\l angle u \\r angle / U_0" ,
+ )
+ lines! (ax, xp[ 2 ][ 2 : end - 1 ], umean)
+ ax = Axis (
+ fig[ 1 , 2 ];
+ title = "Streamwise energy spectrum" ,
+ xscale = log10,
+ yscale = log10,
+ xlabel = L "k_x" ,
+ ylabel = L " \\h at{U}_{cl} / U_0" ,
+ )
+ # ylims!(ax, (10^(0.0), 10^4.0))
+ ksub = k[ 10 : end ]
+ # lines!(ax, ksub, 1000 .* ksub .^ (-5 / 3); label = L"k^{-5/3}")
+ lines! (ax, ksub, 1e7 .* ksub .^ - 3 ; label = L "k^{-3}" )
+ scatter! (ax, k, E₀; label = "y = $y₀ " )
+ scatter! (ax, k, E₁; label = "y = $y₁ " )
+ axislegend (ax; position = :lb )
+ # on(_ -> autolimits!(ax), E₁)
+
+ fig
+end
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 1 )),
+ method = RKMethods . RK44P2 (),
+ Δt = 0.001 ,
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ # plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ plot = meanplot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 4),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields (u, p)
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Plot pressure
julia fieldplot (state; setup, fieldname = :pressure )
Plot initial velocity
julia fieldplot ((; u = u₀, p = p₀, t = T ( 0 )); setup, fieldname = :velocitynorm )
Plot final velocity
julia fieldplot (state; setup, fieldname = :velocitynorm )
Plot vorticity
julia fieldplot (state; setup, fieldname = :vorticity )
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using FFTW
+using GLMakie
+using IncompressibleNavierStokes
+using LaTeXStrings
+
+outdir = joinpath ( @__DIR__ , "output" , "PlaneJets2D" )
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 6_000 )
+
+# V() = sqrt(T(467.4))
+V () = T ( 21.619435700313733 )
+
+U_A (y) = V () / 2 * ( tanh ((y + T ( 0.5 )) / T ( 0.1 )) - tanh ((y - T ( 0.5 )) / T ( 0.1 )))
+
+U_B (y) =
+ V () / 2 * ( tanh ((y + 1 + T ( 0.5 )) / T ( 0.1 )) - tanh ((y + 1 - T ( 0.5 )) / T ( 0.1 ))) +
+ V () / 2 * ( tanh ((y - 1 + T ( 0.5 )) / T ( 0.1 )) - tanh ((y - 1 - T ( 0.5 )) / T ( 0.1 )))
+
+U_C (y) =
+ V () / 2 * (
+ tanh (((y + T ( 1.0 )) / 1 + T ( 0.5 )) / T ( 0.1 )) -
+ tanh (((y + T ( 1.0 )) / 1 - T ( 0.5 )) / T ( 0.1 ))
+ ) +
+ V () / 4 * (
+ tanh (((y - T ( 1.5 )) / 2 + T ( 0.5 )) / T ( 0.2 )) -
+ tanh (((y - T ( 1.5 )) / 2 - T ( 0.5 )) / T ( 0.2 ))
+ )
+
+U_D (y) =
+ V () / 2 * (
+ tanh (((y + T ( 1.0 )) / 1 + T ( 0.5 )) / T ( 0.1 )) -
+ tanh (((y + T ( 1.0 )) / 1 - T ( 0.5 )) / T ( 0.1 ))
+ ) -
+ V () / 4 * (
+ tanh (((y - T ( 1.5 )) / 2 + T ( 0.5 )) / T ( 0.2 )) -
+ tanh (((y - T ( 1.5 )) / 2 - T ( 0.5 )) / T ( 0.2 ))
+ )
+
+# U(y) = U_A(y)
+# U(y) = U_B(y)
+U (y) = U_C (y)
+# U(y) = U_D(y)
+
+U (x, y) = ( 1 + T ( 0.1 ) * ( rand (T) - T ( 0.5 ))) * U (y)
+
+# boundary_conditions = (
+# (PeriodicBC(), PeriodicBC()),
+# (PressureBC(), PressureBC())
+# )
+
+n = 64
+# n = 128
+# n = 256
+x = LinRange ( T ( 0 ), T ( 16 ), 4 n + 1 ), LinRange ( - T ( 10 ), T ( 10 ), 5 n + 1 )
+plotgrid (x ... )
+
+setup = Setup (x, Re, backend);
+# setup = Setup(; x, Re, boundary_conditions, backend);
+
+ustart = velocityfield (setup, (dim, x, y) -> dim == 1 ? U (x, y) : zero (x));
+
+function meanplot (state; setup)
+ (; xp, Iu, Ip, Nu, N) = setup . grid
+
+ umean = lift (state) do (; u, p, t)
+ reshape ( sum (u[ 1 ][Iu[ 1 ]]; dims = 1 ), :) ./ Nu[ 1 ][ 1 ] ./ V ()
+ end
+
+ K = Nu[ 1 ][ 2 ] ÷ 2
+ k = 1 : (K - 1 )
+
+ # Find energy spectrum where y = 0
+ n₀ = findmin (abs, xp[ 2 ])[ 2 ]
+ E₀ = lift (state) do (; u, p, t)
+ u_y = u[ 1 ][:, n₀]
+ abs .( fft (u_y .^ 2 ))[k .+ 1 ]
+ end
+ y₀ = xp[ 2 ][n₀]
+
+ # Find energy spectrum where y = 1
+ n₁ = findmin (y -> abs (y - 1 ), xp[ 2 ])[ 2 ]
+ E₁ = lift (state) do (; u, p, t)
+ u_y = u[ 1 ][:, n₁]
+ abs .( fft (u_y .^ 2 ))[k .+ 1 ]
+ end
+ y₁ = xp[ 2 ][n₁]
+
+ fig = Figure ()
+ ax = Axis (
+ fig[ 1 , 1 ];
+ title = "Mean streamwise flow" ,
+ xlabel = "y" ,
+ ylabel = L " \\l angle u \\r angle / U_0" ,
+ )
+ lines! (ax, xp[ 2 ][ 2 : end - 1 ], umean)
+ ax = Axis (
+ fig[ 1 , 2 ];
+ title = "Streamwise energy spectrum" ,
+ xscale = log10,
+ yscale = log10,
+ xlabel = L "k_x" ,
+ ylabel = L " \\h at{U}_{cl} / U_0" ,
+ )
+ # ylims!(ax, (10^(0.0), 10^4.0))
+ ksub = k[ 10 : end ]
+ # lines!(ax, ksub, 1000 .* ksub .^ (-5 / 3); label = L"k^{-5/3}")
+ lines! (ax, ksub, 1e7 .* ksub .^ - 3 ; label = L "k^{-3}" )
+ scatter! (ax, k, E₀; label = "y = $y₀ " )
+ scatter! (ax, k, E₁; label = "y = $y₁ " )
+ axislegend (ax; position = :lb )
+ # on(_ -> autolimits!(ax), E₁)
+
+ fig
+end
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 1 )),
+ method = RKMethods . RK44P2 (),
+ Δt = 0.001 ,
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ # plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ plot = meanplot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 4),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+outputs . rtp
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+fieldplot (state; setup, fieldname = :pressure )
+
+fieldplot ((; u = u₀, p = p₀, t = T ( 0 )); setup, fieldname = :velocitynorm )
+
+fieldplot (state; setup, fieldname = :velocitynorm )
+
+fieldplot (state; setup, fieldname = :vorticity )
This page was generated using Literate.jl .
`,45)]))}const y=i(n,[["render",l]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_PlaneJets2D.md.Cxpw6Mt8.lean.js b/previews/PR126/assets/examples_generated_PlaneJets2D.md.Cxpw6Mt8.lean.js
new file mode 100644
index 00000000..b5f02751
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_PlaneJets2D.md.Cxpw6Mt8.lean.js
@@ -0,0 +1,273 @@
+import{_ as i,c as a,a5 as h,o as k}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Plane jets - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/PlaneJets2D.md","filePath":"examples/generated/PlaneJets2D.md","lastUpdated":null}'),n={name:"examples/generated/PlaneJets2D.md"};function l(p,s,t,e,E,d){return k(),a("div",null,s[0]||(s[0]=[h(`Note: Output is not generated for this example (to save resources on GitHub).
Plane jets - 2D Plane jets example, as presented in [4 ]. Note that the original formulation is in 3D.
We start by loading packages. A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using FFTW
+using CairoMakie
+using IncompressibleNavierStokes
+using LaTeXStrings
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "PlaneJets2D" )
Floating point type
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Reynolds number
Test cases (A, B, C, D; in order)
julia # V() = sqrt(T(467.4))
+V () = T ( 21.619435700313733 )
+
+U_A (y) = V () / 2 * ( tanh ((y + T ( 0.5 )) / T ( 0.1 )) - tanh ((y - T ( 0.5 )) / T ( 0.1 )))
+
+U_B (y) =
+ V () / 2 * ( tanh ((y + 1 + T ( 0.5 )) / T ( 0.1 )) - tanh ((y + 1 - T ( 0.5 )) / T ( 0.1 ))) +
+ V () / 2 * ( tanh ((y - 1 + T ( 0.5 )) / T ( 0.1 )) - tanh ((y - 1 - T ( 0.5 )) / T ( 0.1 )))
+
+U_C (y) =
+ V () / 2 * (
+ tanh (((y + T ( 1.0 )) / 1 + T ( 0.5 )) / T ( 0.1 )) -
+ tanh (((y + T ( 1.0 )) / 1 - T ( 0.5 )) / T ( 0.1 ))
+ ) +
+ V () / 4 * (
+ tanh (((y - T ( 1.5 )) / 2 + T ( 0.5 )) / T ( 0.2 )) -
+ tanh (((y - T ( 1.5 )) / 2 - T ( 0.5 )) / T ( 0.2 ))
+ )
+
+U_D (y) =
+ V () / 2 * (
+ tanh (((y + T ( 1.0 )) / 1 + T ( 0.5 )) / T ( 0.1 )) -
+ tanh (((y + T ( 1.0 )) / 1 - T ( 0.5 )) / T ( 0.1 ))
+ ) -
+ V () / 4 * (
+ tanh (((y - T ( 1.5 )) / 2 + T ( 0.5 )) / T ( 0.2 )) -
+ tanh (((y - T ( 1.5 )) / 2 - T ( 0.5 )) / T ( 0.2 ))
+ )
+
+# U(y) = U_A(y)
+# U(y) = U_B(y)
+U (y) = U_C (y)
+# U(y) = U_D(y)
Random noise to stimulate turbulence
julia U (x, y) = ( 1 + T ( 0.1 ) * ( rand (T) - T ( 0.5 ))) * U (y)
+
+# boundary_conditions = (
+# (PeriodicBC(), PeriodicBC()),
+# (PressureBC(), PressureBC())
+# )
A 2D grid is a Cartesian product of two vectors
julia n = 64
+# n = 128
+# n = 256
+x = LinRange ( T ( 0 ), T ( 16 ), 4 n + 1 ), LinRange ( - T ( 10 ), T ( 10 ), 5 n + 1 )
+plotgrid (x ... )
Build setup and assemble operators
julia setup = Setup (x, Re, backend);
+# setup = Setup(; x, Re, boundary_conditions, backend);
Initial conditions
julia ustart = velocityfield (setup, (dim, x, y) -> dim == 1 ? U (x, y) : zero (x));
+nothing #hide
Real time plot: Streamwise average and spectrum
julia function meanplot (state; setup)
+ (; xp, Iu, Ip, Nu, N) = setup . grid
+
+ umean = lift (state) do (; u, p, t)
+ reshape ( sum (u[ 1 ][Iu[ 1 ]]; dims = 1 ), :) ./ Nu[ 1 ][ 1 ] ./ V ()
+ end
+
+ K = Nu[ 1 ][ 2 ] ÷ 2
+ k = 1 : (K - 1 )
+
+ # Find energy spectrum where y = 0
+ n₀ = findmin (abs, xp[ 2 ])[ 2 ]
+ E₀ = lift (state) do (; u, p, t)
+ u_y = u[ 1 ][:, n₀]
+ abs .( fft (u_y .^ 2 ))[k .+ 1 ]
+ end
+ y₀ = xp[ 2 ][n₀]
+
+ # Find energy spectrum where y = 1
+ n₁ = findmin (y -> abs (y - 1 ), xp[ 2 ])[ 2 ]
+ E₁ = lift (state) do (; u, p, t)
+ u_y = u[ 1 ][:, n₁]
+ abs .( fft (u_y .^ 2 ))[k .+ 1 ]
+ end
+ y₁ = xp[ 2 ][n₁]
+
+ fig = Figure ()
+ ax = Axis (
+ fig[ 1 , 1 ];
+ title = "Mean streamwise flow" ,
+ xlabel = "y" ,
+ ylabel = L " \\l angle u \\r angle / U_0" ,
+ )
+ lines! (ax, xp[ 2 ][ 2 : end - 1 ], umean)
+ ax = Axis (
+ fig[ 1 , 2 ];
+ title = "Streamwise energy spectrum" ,
+ xscale = log10,
+ yscale = log10,
+ xlabel = L "k_x" ,
+ ylabel = L " \\h at{U}_{cl} / U_0" ,
+ )
+ # ylims!(ax, (10^(0.0), 10^4.0))
+ ksub = k[ 10 : end ]
+ # lines!(ax, ksub, 1000 .* ksub .^ (-5 / 3); label = L"k^{-5/3}")
+ lines! (ax, ksub, 1e7 .* ksub .^ - 3 ; label = L "k^{-3}" )
+ scatter! (ax, k, E₀; label = "y = $y₀ " )
+ scatter! (ax, k, E₁; label = "y = $y₁ " )
+ axislegend (ax; position = :lb )
+ # on(_ -> autolimits!(ax), E₁)
+
+ fig
+end
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 1 )),
+ method = RKMethods . RK44P2 (),
+ Δt = 0.001 ,
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ # plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ plot = meanplot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 4),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields (u, p)
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Plot pressure
julia fieldplot (state; setup, fieldname = :pressure )
Plot initial velocity
julia fieldplot ((; u = u₀, p = p₀, t = T ( 0 )); setup, fieldname = :velocitynorm )
Plot final velocity
julia fieldplot (state; setup, fieldname = :velocitynorm )
Plot vorticity
julia fieldplot (state; setup, fieldname = :vorticity )
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using FFTW
+using GLMakie
+using IncompressibleNavierStokes
+using LaTeXStrings
+
+outdir = joinpath ( @__DIR__ , "output" , "PlaneJets2D" )
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 6_000 )
+
+# V() = sqrt(T(467.4))
+V () = T ( 21.619435700313733 )
+
+U_A (y) = V () / 2 * ( tanh ((y + T ( 0.5 )) / T ( 0.1 )) - tanh ((y - T ( 0.5 )) / T ( 0.1 )))
+
+U_B (y) =
+ V () / 2 * ( tanh ((y + 1 + T ( 0.5 )) / T ( 0.1 )) - tanh ((y + 1 - T ( 0.5 )) / T ( 0.1 ))) +
+ V () / 2 * ( tanh ((y - 1 + T ( 0.5 )) / T ( 0.1 )) - tanh ((y - 1 - T ( 0.5 )) / T ( 0.1 )))
+
+U_C (y) =
+ V () / 2 * (
+ tanh (((y + T ( 1.0 )) / 1 + T ( 0.5 )) / T ( 0.1 )) -
+ tanh (((y + T ( 1.0 )) / 1 - T ( 0.5 )) / T ( 0.1 ))
+ ) +
+ V () / 4 * (
+ tanh (((y - T ( 1.5 )) / 2 + T ( 0.5 )) / T ( 0.2 )) -
+ tanh (((y - T ( 1.5 )) / 2 - T ( 0.5 )) / T ( 0.2 ))
+ )
+
+U_D (y) =
+ V () / 2 * (
+ tanh (((y + T ( 1.0 )) / 1 + T ( 0.5 )) / T ( 0.1 )) -
+ tanh (((y + T ( 1.0 )) / 1 - T ( 0.5 )) / T ( 0.1 ))
+ ) -
+ V () / 4 * (
+ tanh (((y - T ( 1.5 )) / 2 + T ( 0.5 )) / T ( 0.2 )) -
+ tanh (((y - T ( 1.5 )) / 2 - T ( 0.5 )) / T ( 0.2 ))
+ )
+
+# U(y) = U_A(y)
+# U(y) = U_B(y)
+U (y) = U_C (y)
+# U(y) = U_D(y)
+
+U (x, y) = ( 1 + T ( 0.1 ) * ( rand (T) - T ( 0.5 ))) * U (y)
+
+# boundary_conditions = (
+# (PeriodicBC(), PeriodicBC()),
+# (PressureBC(), PressureBC())
+# )
+
+n = 64
+# n = 128
+# n = 256
+x = LinRange ( T ( 0 ), T ( 16 ), 4 n + 1 ), LinRange ( - T ( 10 ), T ( 10 ), 5 n + 1 )
+plotgrid (x ... )
+
+setup = Setup (x, Re, backend);
+# setup = Setup(; x, Re, boundary_conditions, backend);
+
+ustart = velocityfield (setup, (dim, x, y) -> dim == 1 ? U (x, y) : zero (x));
+
+function meanplot (state; setup)
+ (; xp, Iu, Ip, Nu, N) = setup . grid
+
+ umean = lift (state) do (; u, p, t)
+ reshape ( sum (u[ 1 ][Iu[ 1 ]]; dims = 1 ), :) ./ Nu[ 1 ][ 1 ] ./ V ()
+ end
+
+ K = Nu[ 1 ][ 2 ] ÷ 2
+ k = 1 : (K - 1 )
+
+ # Find energy spectrum where y = 0
+ n₀ = findmin (abs, xp[ 2 ])[ 2 ]
+ E₀ = lift (state) do (; u, p, t)
+ u_y = u[ 1 ][:, n₀]
+ abs .( fft (u_y .^ 2 ))[k .+ 1 ]
+ end
+ y₀ = xp[ 2 ][n₀]
+
+ # Find energy spectrum where y = 1
+ n₁ = findmin (y -> abs (y - 1 ), xp[ 2 ])[ 2 ]
+ E₁ = lift (state) do (; u, p, t)
+ u_y = u[ 1 ][:, n₁]
+ abs .( fft (u_y .^ 2 ))[k .+ 1 ]
+ end
+ y₁ = xp[ 2 ][n₁]
+
+ fig = Figure ()
+ ax = Axis (
+ fig[ 1 , 1 ];
+ title = "Mean streamwise flow" ,
+ xlabel = "y" ,
+ ylabel = L " \\l angle u \\r angle / U_0" ,
+ )
+ lines! (ax, xp[ 2 ][ 2 : end - 1 ], umean)
+ ax = Axis (
+ fig[ 1 , 2 ];
+ title = "Streamwise energy spectrum" ,
+ xscale = log10,
+ yscale = log10,
+ xlabel = L "k_x" ,
+ ylabel = L " \\h at{U}_{cl} / U_0" ,
+ )
+ # ylims!(ax, (10^(0.0), 10^4.0))
+ ksub = k[ 10 : end ]
+ # lines!(ax, ksub, 1000 .* ksub .^ (-5 / 3); label = L"k^{-5/3}")
+ lines! (ax, ksub, 1e7 .* ksub .^ - 3 ; label = L "k^{-3}" )
+ scatter! (ax, k, E₀; label = "y = $y₀ " )
+ scatter! (ax, k, E₁; label = "y = $y₁ " )
+ axislegend (ax; position = :lb )
+ # on(_ -> autolimits!(ax), E₁)
+
+ fig
+end
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 1 )),
+ method = RKMethods . RK44P2 (),
+ Δt = 0.001 ,
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ # plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ plot = meanplot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 4),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+outputs . rtp
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+fieldplot (state; setup, fieldname = :pressure )
+
+fieldplot ((; u = u₀, p = p₀, t = T ( 0 )); setup, fieldname = :velocitynorm )
+
+fieldplot (state; setup, fieldname = :velocitynorm )
+
+fieldplot (state; setup, fieldname = :vorticity )
This page was generated using Literate.jl .
`,45)]))}const y=i(n,[["render",l]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_RayleighBenard2D.md.DlQrJFaM.js b/previews/PR126/assets/examples_generated_RayleighBenard2D.md.DlQrJFaM.js
new file mode 100644
index 00000000..8bc9b654
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_RayleighBenard2D.md.DlQrJFaM.js
@@ -0,0 +1,222 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const t="/IncompressibleNavierStokes.jl/previews/PR126/assets/cuibxhd.BxypEGK2.png",l="/IncompressibleNavierStokes.jl/previews/PR126/RayleighBenard2D.mp4",k="/IncompressibleNavierStokes.jl/previews/PR126/assets/xsmunma.C3CW_rGA.png",p="/IncompressibleNavierStokes.jl/previews/PR126/assets/jqxyinv.D8geYuhY.png",C=JSON.parse('{"title":"Rayleigh-Bénard convection (2D)","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/RayleighBenard2D.md","filePath":"examples/generated/RayleighBenard2D.md","lastUpdated":null}'),e={name:"examples/generated/RayleighBenard2D.md"};function E(r,s,d,g,y,F){return h(),a("div",null,s[0]||(s[0]=[n(`Rayleigh-Bénard convection (2D) A hot and a cold plate generate a convection cell in a box.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory for saving results
julia outdir = joinpath ( @__DIR__ , "output" , "RayleighBenard2D" )
"/home/runner/work/IncompressibleNavierStokes.jl/IncompressibleNavierStokes.jl/docs/build/examples/generated/output/RayleighBenard2D"
Hardware
julia backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
Define observer function to track Nusselt numbers on top and bottom plates.
julia function nusseltplot (state; setup)
+ state isa Observable || (state = Observable (state))
+ (; Δ, Δu) = setup . grid
+ Δy1 = Δu[ 2 ][ 1 : 1 ] |> sum
+ Δy2 = Δu[ 2 ][ end - 1 : end - 1 ] |> sum
+
+ # Observe Nusselt numbers
+ Nu1 = Observable (Point2f[])
+ Nu2 = Observable (Point2f[])
+ on (state) do (; temp, t)
+ dTdy = @. (temp[:, 2 ] - temp[:, 1 ]) / Δy1
+ Nu = sum (( .- dTdy .* Δ[ 1 ])[ 2 : end - 1 ])
+ push! (Nu1[], Point2f (t, Nu))
+ dTdy = @. (temp[:, end - 1 ] - temp[:, end - 2 ]) / Δy2
+ Nu = sum (( .- dTdy .* Δ[ 1 ])[ 2 : end - 1 ])
+ push! (Nu2[], Point2f (t, Nu))
+ (Nu1, Nu2) .|> notify ## Update plot
+ end
+
+ # Plot Nu history
+ fig = Figure ()
+ ax = Axis (fig[ 1 , 1 ]; title = "Nusselt number" , xlabel = "t" , ylabel = "Nu" )
+ lines! (ax, Nu1; label = "Lower plate" )
+ lines! (ax, Nu2; label = "Upper plate" )
+ axislegend (ax)
+ on (_ -> autolimits! (ax), Nu2)
+ fig
+end
nusseltplot (generic function with 1 method)
Define observer function to track average temperature.
julia function averagetemp (state; setup)
+ state isa Observable || (state = Observable (state))
+ (; xp, Δ, Ip) = setup . grid
+ ix = Ip . indices[ 1 ]
+ Ty = lift (state) do (; temp)
+ Ty = sum (temp[ix, :] .* Δ[ 1 ][ix]; dims = 1 ) ./ sum (Δ[ 1 ][ix])
+ Array (Ty)[:]
+ end
+ Ty0 = copy (Ty[])
+ yy = Array (xp[ 2 ])
+ fig = Figure ()
+ ax = Axis (fig[ 1 , 1 ]; title = "Average temperature" , xlabel = "T" , ylabel = "y" )
+ lines! (ax, Ty0, yy; label = "t = 0" )
+ lines! (ax, Ty, yy; label = "t = t" )
+ axislegend (ax)
+ on (_ -> autolimits! (ax), Ty)
+ fig
+end
averagetemp (generic function with 1 method)
Instabilities should depend on the floating point precision. Try both Float32
and Float64
.
Temperature equation setup.
julia temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e7 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (
+ ( SymmetricBC (), SymmetricBC ()),
+ ( DirichletBC ( T ( 1 )), DirichletBC ( T ( 0 ))),
+ ),
+ gdir = 2 ,
+ nondim_type = 1 ,
+)
(α1 = 0.00026645826f0, α2 = 1.0f0, α3 = 0.00026645826f0, α4 = 0.0003752933f0, γ = 1.0f0, dodissipation = true, boundary_conditions = ((SymmetricBC(), SymmetricBC()), (DirichletBC{Float32}(1.0f0), DirichletBC{Float32}(0.0f0))), gdir = 2)
Grid
julia n = 100
+x = tanh_grid ( T ( 0 ), T ( 2 ), 2 n, T ( 1.2 )), tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.2 ))
+plotgrid (x ... )
Setup
julia setup = Setup (;
+ x,
+ boundary_conditions = (( DirichletBC (), DirichletBC ()), ( DirichletBC (), DirichletBC ())),
+ Re = 1 / temperature . α1,
+ temperature,
+ backend,
+);
Initial conditions
julia ustart = velocityfield (setup, (dim, x, y) -> zero (x));
+tempstart = temperaturefield (setup, (x, y) -> one (y) / 2 + max ( sinpi ( 20 * x) / 100 , 0 ));
Processors
julia processors = (;
+ rtp = realtimeplotter (;
+ setup,
+ fieldname = :temperature ,
+ colorrange = ( T ( 0 ), T ( 1 )),
+ size = ( 600 , 350 ),
+ colormap = :seaborn_icefire_gradient ,
+ nupdate = 20 ,
+ ),
+ nusselt = realtimeplotter (;
+ setup,
+ plot = nusseltplot,
+ nupdate = 20 ,
+ ),
+ avg = realtimeplotter (;
+ setup,
+ plot = averagetemp,
+ nupdate = 50 ,
+ ),
+ log = timelogger (; nupdate = 1000 ),
+)
(rtp = (initialize = IncompressibleNavierStokesMakieExt.var"#10#12"{@NamedTuple{grid::@NamedTuple{xlims::Tuple{Tuple{Float32, Float32}, Tuple{Float32, Float32}}, dimension::IncompressibleNavierStokes.Dimension{2}, N::Tuple{Int64, Int64}, Nu::Tuple{Tuple{Int64, Int64}, Tuple{Int64, Int64}}, Np::Tuple{Int64, Int64}, Iu::Tuple{CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}, CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}}, Ip::CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}, x::Tuple{Vector{Float32}, Vector{Float32}}, xu::Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}, xp::Tuple{Vector{Float32}, Vector{Float32}}, Δ::Tuple{Vector{Float32}, Vector{Float32}}, Δu::Tuple{Vector{Float32}, Vector{Float32}}, A::Tuple{Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}, Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}}}, boundary_conditions::Tuple{Tuple{DirichletBC{Nothing}, DirichletBC{Nothing}}, Tuple{DirichletBC{Nothing}, DirichletBC{Nothing}}}, Re::Float32, bodyforce::Nothing, issteadybodyforce::Bool, closure_model::Nothing, backend::CPU, workgroupsize::Int64, temperature::@NamedTuple{α1::Float32, α2::Float32, α3::Float32, α4::Float32, γ::Float32, dodissipation::Bool, boundary_conditions::Tuple{Tuple{SymmetricBC, SymmetricBC}, Tuple{DirichletBC{Float32}, DirichletBC{Float32}}}, gdir::Int64}}, typeof(fieldplot), Int64, Bool, Nothing, Bool, Nothing, Base.Pairs{Symbol, Any, NTuple{4, Symbol}, @NamedTuple{fieldname::Symbol, colorrange::Tuple{Float32, Float32}, size::Tuple{Int64, Int64}, colormap::Symbol}}}((grid = (xlims = ((0.0f0, 2.0f0), (0.0f0, 1.0f0)), dimension = IncompressibleNavierStokes.Dimension{2}(), N = (202, 102), Nu = ((199, 100), (200, 99)), Np = (200, 100), Iu = (CartesianIndices((2:200, 2:101)), CartesianIndices((2:201, 2:100))), Ip = CartesianIndices((2:201, 2:101)), x = (Float32[0.0, 0.0, 0.0044347644, 0.008958757, 0.0135733485, 0.01827985, 0.023079693, 0.027974367, 0.032965183, 0.038053393 … 1.9619466, 1.9670348, 1.9720256, 1.9769204, 1.9817202, 1.9864266, 1.9910412, 1.9955652, 2.0, 2.0], Float32[0.0, 0.0, 0.0044793785, 0.009139925, 0.013987184, 0.019026697, 0.024263948, 0.029704452, 0.03535363, 0.04121679 … 0.9587832, 0.96464634, 0.97029555, 0.975736, 0.9809733, 0.9860128, 0.9908601, 0.9955206, 1.0, 1.0]), xu = ((Float32[0.0, 0.0044347644, 0.008958757, 0.0135733485, 0.01827985, 0.023079693, 0.027974367, 0.032965183, 0.038053393, 0.043240547 … 1.9619466, 1.9670348, 1.9720256, 1.9769204, 1.9817202, 1.9864266, 1.9910412, 1.9955652, 2.0, 2.0], Float32[0.0, 0.0022396892, 0.006809652, 0.011563554, 0.01650694, 0.021645322, 0.0269842, 0.03252904, 0.03828521, 0.044257984 … 0.955742, 0.96171474, 0.96747094, 0.9730158, 0.9783547, 0.9834931, 0.98843646, 0.99319035, 0.9977603, 1.0]), (Float32[0.0, 0.0022173822, 0.0066967607, 0.011266053, 0.0159266, 0.020679772, 0.02552703, 0.030469775, 0.03550929, 0.04064697 … 1.959353, 1.9644907, 1.9695302, 1.974473, 1.9793203, 1.9840734, 1.9887339, 1.9933032, 1.9977826, 2.0], Float32[0.0, 0.0044793785, 0.009139925, 0.013987184, 0.019026697, 0.024263948, 0.029704452, 0.03535363, 0.04121679, 0.047299176 … 0.9587832, 0.96464634, 0.97029555, 0.975736, 0.9809733, 0.9860128, 0.9908601, 0.9955206, 1.0, 1.0])), xp = (Float32[0.0, 0.0022173822, 0.0066967607, 0.011266053, 0.0159266, 0.020679772, 0.02552703, 0.030469775, 0.03550929, 0.04064697 … 1.959353, 1.9644907, 1.9695302, 1.974473, 1.9793203, 1.9840734, 1.9887339, 1.9933032, 1.9977826, 2.0], Float32[0.0, 0.0022396892, 0.006809652, 0.011563554, 0.01650694, 0.021645322, 0.0269842, 0.03252904, 0.03828521, 0.044257984 … 0.955742, 0.96171474, 0.96747094, 0.9730158, 0.9783547, 0.9834931, 0.98843646, 0.99319035, 0.9977603, 1.0]), Δ = (Float32[1.1920929f-7, 0.0044347644, 0.0045239925, 0.0046145916, 0.004706502, 0.004799843, 0.004894674, 0.004990816, 0.00508821, 0.005187154 … 0.005187154, 0.00508821, 0.004990816, 0.0048947334, 0.004799843, 0.0047063828, 0.0046145916, 0.0045239925, 0.004434824, 1.1920929f-7], Float32[1.1920929f-7, 0.0044793785, 0.004660547, 0.0048472583, 0.005039513, 0.0052372515, 0.0054405034, 0.005649179, 0.00586316, 0.006082386 … 0.006082356, 0.00586313, 0.005649209, 0.0054404736, 0.0052372813, 0.005039513, 0.004847288, 0.004660487, 0.0044794083, 1.1920929f-7]), Δu = (Float32[0.0022173822, 0.0044793785, 0.004569292, 0.004660547, 0.0047531724, 0.0048472583, 0.004942745, 0.005039513, 0.005137682, 0.0052372515 … 0.005137682, 0.0050395727, 0.004942775, 0.004847288, 0.004753113, 0.004660487, 0.004569292, 0.0044794083, 0.002217412, 1.1920929f-7], Float32[0.0022396892, 0.0045699626, 0.0047539026, 0.0049433857, 0.0051383823, 0.0053388774, 0.0055448413, 0.0057561696, 0.005972773, 0.0061945915 … 0.005972743, 0.0057561994, 0.0055448413, 0.0053389072, 0.005138397, 0.004943371, 0.0047538877, 0.0045699477, 0.0022397041, 1.1920929f-7]), A = (((Float32[1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], Float32[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), (Float32[1.0, 1.0, 0.5099108, 0.50981885, 0.5097228, 0.50962067, 0.50951755, 0.5094086, 0.50929356, 0.509176 … 0.49093604, 0.49081892, 0.4907065, 0.49058872, 0.4904881, 0.49038374, 0.49028164, 0.49017644, 0.49009407, 0.0], Float32[0.0, 0.49008918, 0.49018115, 0.49027717, 0.49037933, 0.49048245, 0.49059144, 0.49070647, 0.49082395, 0.49094325 … 0.5091811, 0.5092935, 0.5094113, 0.5095119, 0.50961626, 0.50971836, 0.50982356, 0.50990593, 1.0, 1.0])), ((Float32[1.0, 1.0, 0.50497997, 0.50495696, 0.50493026, 0.5049094, 0.5048909, 0.5048628, 0.50483155, 0.5048146 … 0.49520862, 0.4951738, 0.4951626, 0.49514025, 0.49510598, 0.4950843, 0.49507612, 0.49504304, 0.49502343, 0.0], Float32[0.0, 0.49502006, 0.49504304, 0.49506977, 0.4950906, 0.49510905, 0.4951372, 0.49516848, 0.4951854, 0.49521717 … 0.5048262, 0.5048374, 0.50485975, 0.504894, 0.5049157, 0.5049239, 0.50495696, 0.5049766, 1.0, 1.0]), (Float32[1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], Float32[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])))), boundary_conditions = ((DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing)), (DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing))), Re = 3752.933f0, bodyforce = nothing, issteadybodyforce = false, closure_model = nothing, backend = CPU(false), workgroupsize = 64, temperature = (α1 = 0.00026645826f0, α2 = 1.0f0, α3 = 0.00026645826f0, α4 = 0.0003752933f0, γ = 1.0f0, dodissipation = true, boundary_conditions = ((SymmetricBC(), SymmetricBC()), (DirichletBC{Float32}(1.0f0), DirichletBC{Float32}(0.0f0))), gdir = 2)), IncompressibleNavierStokes.fieldplot, 20, true, nothing, false, nothing, Base.Pairs{Symbol, Any, NTuple{4, Symbol}, @NamedTuple{fieldname::Symbol, colorrange::Tuple{Float32, Float32}, size::Tuple{Int64, Int64}, colormap::Symbol}}(:fieldname => :temperature, :colorrange => (0.0f0, 1.0f0), :size => (600, 350), :colormap => :seaborn_icefire_gradient)), finalize = IncompressibleNavierStokes.var"#295#296"()), nusselt = (initialize = IncompressibleNavierStokesMakieExt.var"#10#12"{@NamedTuple{grid::@NamedTuple{xlims::Tuple{Tuple{Float32, Float32}, Tuple{Float32, Float32}}, dimension::IncompressibleNavierStokes.Dimension{2}, N::Tuple{Int64, Int64}, Nu::Tuple{Tuple{Int64, Int64}, Tuple{Int64, Int64}}, Np::Tuple{Int64, Int64}, Iu::Tuple{CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}, CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}}, Ip::CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}, x::Tuple{Vector{Float32}, Vector{Float32}}, xu::Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}, xp::Tuple{Vector{Float32}, Vector{Float32}}, Δ::Tuple{Vector{Float32}, Vector{Float32}}, Δu::Tuple{Vector{Float32}, Vector{Float32}}, A::Tuple{Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}, Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}}}, boundary_conditions::Tuple{Tuple{DirichletBC{Nothing}, DirichletBC{Nothing}}, Tuple{DirichletBC{Nothing}, DirichletBC{Nothing}}}, Re::Float32, bodyforce::Nothing, issteadybodyforce::Bool, closure_model::Nothing, backend::CPU, workgroupsize::Int64, temperature::@NamedTuple{α1::Float32, α2::Float32, α3::Float32, α4::Float32, γ::Float32, dodissipation::Bool, boundary_conditions::Tuple{Tuple{SymmetricBC, SymmetricBC}, Tuple{DirichletBC{Float32}, DirichletBC{Float32}}}, gdir::Int64}}, typeof(Main.nusseltplot), Int64, Bool, Nothing, Bool, Nothing, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}}((grid = (xlims = ((0.0f0, 2.0f0), (0.0f0, 1.0f0)), dimension = IncompressibleNavierStokes.Dimension{2}(), N = (202, 102), Nu = ((199, 100), (200, 99)), Np = (200, 100), Iu = (CartesianIndices((2:200, 2:101)), CartesianIndices((2:201, 2:100))), Ip = CartesianIndices((2:201, 2:101)), x = (Float32[0.0, 0.0, 0.0044347644, 0.008958757, 0.0135733485, 0.01827985, 0.023079693, 0.027974367, 0.032965183, 0.038053393 … 1.9619466, 1.9670348, 1.9720256, 1.9769204, 1.9817202, 1.9864266, 1.9910412, 1.9955652, 2.0, 2.0], Float32[0.0, 0.0, 0.0044793785, 0.009139925, 0.013987184, 0.019026697, 0.024263948, 0.029704452, 0.03535363, 0.04121679 … 0.9587832, 0.96464634, 0.97029555, 0.975736, 0.9809733, 0.9860128, 0.9908601, 0.9955206, 1.0, 1.0]), xu = ((Float32[0.0, 0.0044347644, 0.008958757, 0.0135733485, 0.01827985, 0.023079693, 0.027974367, 0.032965183, 0.038053393, 0.043240547 … 1.9619466, 1.9670348, 1.9720256, 1.9769204, 1.9817202, 1.9864266, 1.9910412, 1.9955652, 2.0, 2.0], Float32[0.0, 0.0022396892, 0.006809652, 0.011563554, 0.01650694, 0.021645322, 0.0269842, 0.03252904, 0.03828521, 0.044257984 … 0.955742, 0.96171474, 0.96747094, 0.9730158, 0.9783547, 0.9834931, 0.98843646, 0.99319035, 0.9977603, 1.0]), (Float32[0.0, 0.0022173822, 0.0066967607, 0.011266053, 0.0159266, 0.020679772, 0.02552703, 0.030469775, 0.03550929, 0.04064697 … 1.959353, 1.9644907, 1.9695302, 1.974473, 1.9793203, 1.9840734, 1.9887339, 1.9933032, 1.9977826, 2.0], Float32[0.0, 0.0044793785, 0.009139925, 0.013987184, 0.019026697, 0.024263948, 0.029704452, 0.03535363, 0.04121679, 0.047299176 … 0.9587832, 0.96464634, 0.97029555, 0.975736, 0.9809733, 0.9860128, 0.9908601, 0.9955206, 1.0, 1.0])), xp = (Float32[0.0, 0.0022173822, 0.0066967607, 0.011266053, 0.0159266, 0.020679772, 0.02552703, 0.030469775, 0.03550929, 0.04064697 … 1.959353, 1.9644907, 1.9695302, 1.974473, 1.9793203, 1.9840734, 1.9887339, 1.9933032, 1.9977826, 2.0], Float32[0.0, 0.0022396892, 0.006809652, 0.011563554, 0.01650694, 0.021645322, 0.0269842, 0.03252904, 0.03828521, 0.044257984 … 0.955742, 0.96171474, 0.96747094, 0.9730158, 0.9783547, 0.9834931, 0.98843646, 0.99319035, 0.9977603, 1.0]), Δ = (Float32[1.1920929f-7, 0.0044347644, 0.0045239925, 0.0046145916, 0.004706502, 0.004799843, 0.004894674, 0.004990816, 0.00508821, 0.005187154 … 0.005187154, 0.00508821, 0.004990816, 0.0048947334, 0.004799843, 0.0047063828, 0.0046145916, 0.0045239925, 0.004434824, 1.1920929f-7], Float32[1.1920929f-7, 0.0044793785, 0.004660547, 0.0048472583, 0.005039513, 0.0052372515, 0.0054405034, 0.005649179, 0.00586316, 0.006082386 … 0.006082356, 0.00586313, 0.005649209, 0.0054404736, 0.0052372813, 0.005039513, 0.004847288, 0.004660487, 0.0044794083, 1.1920929f-7]), Δu = (Float32[0.0022173822, 0.0044793785, 0.004569292, 0.004660547, 0.0047531724, 0.0048472583, 0.004942745, 0.005039513, 0.005137682, 0.0052372515 … 0.005137682, 0.0050395727, 0.004942775, 0.004847288, 0.004753113, 0.004660487, 0.004569292, 0.0044794083, 0.002217412, 1.1920929f-7], Float32[0.0022396892, 0.0045699626, 0.0047539026, 0.0049433857, 0.0051383823, 0.0053388774, 0.0055448413, 0.0057561696, 0.005972773, 0.0061945915 … 0.005972743, 0.0057561994, 0.0055448413, 0.0053389072, 0.005138397, 0.004943371, 0.0047538877, 0.0045699477, 0.0022397041, 1.1920929f-7]), A = (((Float32[1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], Float32[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), (Float32[1.0, 1.0, 0.5099108, 0.50981885, 0.5097228, 0.50962067, 0.50951755, 0.5094086, 0.50929356, 0.509176 … 0.49093604, 0.49081892, 0.4907065, 0.49058872, 0.4904881, 0.49038374, 0.49028164, 0.49017644, 0.49009407, 0.0], Float32[0.0, 0.49008918, 0.49018115, 0.49027717, 0.49037933, 0.49048245, 0.49059144, 0.49070647, 0.49082395, 0.49094325 … 0.5091811, 0.5092935, 0.5094113, 0.5095119, 0.50961626, 0.50971836, 0.50982356, 0.50990593, 1.0, 1.0])), ((Float32[1.0, 1.0, 0.50497997, 0.50495696, 0.50493026, 0.5049094, 0.5048909, 0.5048628, 0.50483155, 0.5048146 … 0.49520862, 0.4951738, 0.4951626, 0.49514025, 0.49510598, 0.4950843, 0.49507612, 0.49504304, 0.49502343, 0.0], Float32[0.0, 0.49502006, 0.49504304, 0.49506977, 0.4950906, 0.49510905, 0.4951372, 0.49516848, 0.4951854, 0.49521717 … 0.5048262, 0.5048374, 0.50485975, 0.504894, 0.5049157, 0.5049239, 0.50495696, 0.5049766, 1.0, 1.0]), (Float32[1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], Float32[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])))), boundary_conditions = ((DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing)), (DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing))), Re = 3752.933f0, bodyforce = nothing, issteadybodyforce = false, closure_model = nothing, backend = CPU(false), workgroupsize = 64, temperature = (α1 = 0.00026645826f0, α2 = 1.0f0, α3 = 0.00026645826f0, α4 = 0.0003752933f0, γ = 1.0f0, dodissipation = true, boundary_conditions = ((SymmetricBC(), SymmetricBC()), (DirichletBC{Float32}(1.0f0), DirichletBC{Float32}(0.0f0))), gdir = 2)), Main.nusseltplot, 20, true, nothing, false, nothing, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}()), finalize = IncompressibleNavierStokes.var"#295#296"()), avg = (initialize = IncompressibleNavierStokesMakieExt.var"#10#12"{@NamedTuple{grid::@NamedTuple{xlims::Tuple{Tuple{Float32, Float32}, Tuple{Float32, Float32}}, dimension::IncompressibleNavierStokes.Dimension{2}, N::Tuple{Int64, Int64}, Nu::Tuple{Tuple{Int64, Int64}, Tuple{Int64, Int64}}, Np::Tuple{Int64, Int64}, Iu::Tuple{CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}, CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}}, Ip::CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}, x::Tuple{Vector{Float32}, Vector{Float32}}, xu::Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}, xp::Tuple{Vector{Float32}, Vector{Float32}}, Δ::Tuple{Vector{Float32}, Vector{Float32}}, Δu::Tuple{Vector{Float32}, Vector{Float32}}, A::Tuple{Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}, Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}}}, boundary_conditions::Tuple{Tuple{DirichletBC{Nothing}, DirichletBC{Nothing}}, Tuple{DirichletBC{Nothing}, DirichletBC{Nothing}}}, Re::Float32, bodyforce::Nothing, issteadybodyforce::Bool, closure_model::Nothing, backend::CPU, workgroupsize::Int64, temperature::@NamedTuple{α1::Float32, α2::Float32, α3::Float32, α4::Float32, γ::Float32, dodissipation::Bool, boundary_conditions::Tuple{Tuple{SymmetricBC, SymmetricBC}, Tuple{DirichletBC{Float32}, DirichletBC{Float32}}}, gdir::Int64}}, typeof(Main.averagetemp), Int64, Bool, Nothing, Bool, Nothing, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}}((grid = (xlims = ((0.0f0, 2.0f0), (0.0f0, 1.0f0)), dimension = IncompressibleNavierStokes.Dimension{2}(), N = (202, 102), Nu = ((199, 100), (200, 99)), Np = (200, 100), Iu = (CartesianIndices((2:200, 2:101)), CartesianIndices((2:201, 2:100))), Ip = CartesianIndices((2:201, 2:101)), x = (Float32[0.0, 0.0, 0.0044347644, 0.008958757, 0.0135733485, 0.01827985, 0.023079693, 0.027974367, 0.032965183, 0.038053393 … 1.9619466, 1.9670348, 1.9720256, 1.9769204, 1.9817202, 1.9864266, 1.9910412, 1.9955652, 2.0, 2.0], Float32[0.0, 0.0, 0.0044793785, 0.009139925, 0.013987184, 0.019026697, 0.024263948, 0.029704452, 0.03535363, 0.04121679 … 0.9587832, 0.96464634, 0.97029555, 0.975736, 0.9809733, 0.9860128, 0.9908601, 0.9955206, 1.0, 1.0]), xu = ((Float32[0.0, 0.0044347644, 0.008958757, 0.0135733485, 0.01827985, 0.023079693, 0.027974367, 0.032965183, 0.038053393, 0.043240547 … 1.9619466, 1.9670348, 1.9720256, 1.9769204, 1.9817202, 1.9864266, 1.9910412, 1.9955652, 2.0, 2.0], Float32[0.0, 0.0022396892, 0.006809652, 0.011563554, 0.01650694, 0.021645322, 0.0269842, 0.03252904, 0.03828521, 0.044257984 … 0.955742, 0.96171474, 0.96747094, 0.9730158, 0.9783547, 0.9834931, 0.98843646, 0.99319035, 0.9977603, 1.0]), (Float32[0.0, 0.0022173822, 0.0066967607, 0.011266053, 0.0159266, 0.020679772, 0.02552703, 0.030469775, 0.03550929, 0.04064697 … 1.959353, 1.9644907, 1.9695302, 1.974473, 1.9793203, 1.9840734, 1.9887339, 1.9933032, 1.9977826, 2.0], Float32[0.0, 0.0044793785, 0.009139925, 0.013987184, 0.019026697, 0.024263948, 0.029704452, 0.03535363, 0.04121679, 0.047299176 … 0.9587832, 0.96464634, 0.97029555, 0.975736, 0.9809733, 0.9860128, 0.9908601, 0.9955206, 1.0, 1.0])), xp = (Float32[0.0, 0.0022173822, 0.0066967607, 0.011266053, 0.0159266, 0.020679772, 0.02552703, 0.030469775, 0.03550929, 0.04064697 … 1.959353, 1.9644907, 1.9695302, 1.974473, 1.9793203, 1.9840734, 1.9887339, 1.9933032, 1.9977826, 2.0], Float32[0.0, 0.0022396892, 0.006809652, 0.011563554, 0.01650694, 0.021645322, 0.0269842, 0.03252904, 0.03828521, 0.044257984 … 0.955742, 0.96171474, 0.96747094, 0.9730158, 0.9783547, 0.9834931, 0.98843646, 0.99319035, 0.9977603, 1.0]), Δ = (Float32[1.1920929f-7, 0.0044347644, 0.0045239925, 0.0046145916, 0.004706502, 0.004799843, 0.004894674, 0.004990816, 0.00508821, 0.005187154 … 0.005187154, 0.00508821, 0.004990816, 0.0048947334, 0.004799843, 0.0047063828, 0.0046145916, 0.0045239925, 0.004434824, 1.1920929f-7], Float32[1.1920929f-7, 0.0044793785, 0.004660547, 0.0048472583, 0.005039513, 0.0052372515, 0.0054405034, 0.005649179, 0.00586316, 0.006082386 … 0.006082356, 0.00586313, 0.005649209, 0.0054404736, 0.0052372813, 0.005039513, 0.004847288, 0.004660487, 0.0044794083, 1.1920929f-7]), Δu = (Float32[0.0022173822, 0.0044793785, 0.004569292, 0.004660547, 0.0047531724, 0.0048472583, 0.004942745, 0.005039513, 0.005137682, 0.0052372515 … 0.005137682, 0.0050395727, 0.004942775, 0.004847288, 0.004753113, 0.004660487, 0.004569292, 0.0044794083, 0.002217412, 1.1920929f-7], Float32[0.0022396892, 0.0045699626, 0.0047539026, 0.0049433857, 0.0051383823, 0.0053388774, 0.0055448413, 0.0057561696, 0.005972773, 0.0061945915 … 0.005972743, 0.0057561994, 0.0055448413, 0.0053389072, 0.005138397, 0.004943371, 0.0047538877, 0.0045699477, 0.0022397041, 1.1920929f-7]), A = (((Float32[1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], Float32[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), (Float32[1.0, 1.0, 0.5099108, 0.50981885, 0.5097228, 0.50962067, 0.50951755, 0.5094086, 0.50929356, 0.509176 … 0.49093604, 0.49081892, 0.4907065, 0.49058872, 0.4904881, 0.49038374, 0.49028164, 0.49017644, 0.49009407, 0.0], Float32[0.0, 0.49008918, 0.49018115, 0.49027717, 0.49037933, 0.49048245, 0.49059144, 0.49070647, 0.49082395, 0.49094325 … 0.5091811, 0.5092935, 0.5094113, 0.5095119, 0.50961626, 0.50971836, 0.50982356, 0.50990593, 1.0, 1.0])), ((Float32[1.0, 1.0, 0.50497997, 0.50495696, 0.50493026, 0.5049094, 0.5048909, 0.5048628, 0.50483155, 0.5048146 … 0.49520862, 0.4951738, 0.4951626, 0.49514025, 0.49510598, 0.4950843, 0.49507612, 0.49504304, 0.49502343, 0.0], Float32[0.0, 0.49502006, 0.49504304, 0.49506977, 0.4950906, 0.49510905, 0.4951372, 0.49516848, 0.4951854, 0.49521717 … 0.5048262, 0.5048374, 0.50485975, 0.504894, 0.5049157, 0.5049239, 0.50495696, 0.5049766, 1.0, 1.0]), (Float32[1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], Float32[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])))), boundary_conditions = ((DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing)), (DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing))), Re = 3752.933f0, bodyforce = nothing, issteadybodyforce = false, closure_model = nothing, backend = CPU(false), workgroupsize = 64, temperature = (α1 = 0.00026645826f0, α2 = 1.0f0, α3 = 0.00026645826f0, α4 = 0.0003752933f0, γ = 1.0f0, dodissipation = true, boundary_conditions = ((SymmetricBC(), SymmetricBC()), (DirichletBC{Float32}(1.0f0), DirichletBC{Float32}(0.0f0))), gdir = 2)), Main.averagetemp, 50, true, nothing, false, nothing, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}()), finalize = IncompressibleNavierStokes.var"#295#296"()), log = (initialize = IncompressibleNavierStokes.var"#298#300"{Bool, Bool, Bool, Bool, Bool, Int64}(false, true, true, true, true, 1000), finalize = IncompressibleNavierStokes.var"#295#296"()))
Solve equation
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 20 )),
+ Δt = T ( 1e-2 ),
+ processors,
+);
[ Info: t = 10.0001 Δt = 0.01 umax = 0.24 itertime = 0.014
+[ Info: t = 20.0004 Δt = 0.01 umax = 0.55 itertime = 0.012
Nusselt numbers
Average temperature
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "RayleighBenard2D" )
+
+backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
+
+function nusseltplot (state; setup)
+ state isa Observable || (state = Observable (state))
+ (; Δ, Δu) = setup . grid
+ Δy1 = Δu[ 2 ][ 1 : 1 ] |> sum
+ Δy2 = Δu[ 2 ][ end - 1 : end - 1 ] |> sum
+
+ # Observe Nusselt numbers
+ Nu1 = Observable (Point2f[])
+ Nu2 = Observable (Point2f[])
+ on (state) do (; temp, t)
+ dTdy = @. (temp[:, 2 ] - temp[:, 1 ]) / Δy1
+ Nu = sum (( .- dTdy .* Δ[ 1 ])[ 2 : end - 1 ])
+ push! (Nu1[], Point2f (t, Nu))
+ dTdy = @. (temp[:, end - 1 ] - temp[:, end - 2 ]) / Δy2
+ Nu = sum (( .- dTdy .* Δ[ 1 ])[ 2 : end - 1 ])
+ push! (Nu2[], Point2f (t, Nu))
+ (Nu1, Nu2) .|> notify ## Update plot
+ end
+
+ # Plot Nu history
+ fig = Figure ()
+ ax = Axis (fig[ 1 , 1 ]; title = "Nusselt number" , xlabel = "t" , ylabel = "Nu" )
+ lines! (ax, Nu1; label = "Lower plate" )
+ lines! (ax, Nu2; label = "Upper plate" )
+ axislegend (ax)
+ on (_ -> autolimits! (ax), Nu2)
+ fig
+end
+
+function averagetemp (state; setup)
+ state isa Observable || (state = Observable (state))
+ (; xp, Δ, Ip) = setup . grid
+ ix = Ip . indices[ 1 ]
+ Ty = lift (state) do (; temp)
+ Ty = sum (temp[ix, :] .* Δ[ 1 ][ix]; dims = 1 ) ./ sum (Δ[ 1 ][ix])
+ Array (Ty)[:]
+ end
+ Ty0 = copy (Ty[])
+ yy = Array (xp[ 2 ])
+ fig = Figure ()
+ ax = Axis (fig[ 1 , 1 ]; title = "Average temperature" , xlabel = "T" , ylabel = "y" )
+ lines! (ax, Ty0, yy; label = "t = 0" )
+ lines! (ax, Ty, yy; label = "t = t" )
+ axislegend (ax)
+ on (_ -> autolimits! (ax), Ty)
+ fig
+end
+
+T = Float32
+
+temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e7 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (
+ ( SymmetricBC (), SymmetricBC ()),
+ ( DirichletBC ( T ( 1 )), DirichletBC ( T ( 0 ))),
+ ),
+ gdir = 2 ,
+ nondim_type = 1 ,
+)
+
+n = 100
+x = tanh_grid ( T ( 0 ), T ( 2 ), 2 n, T ( 1.2 )), tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.2 ))
+plotgrid (x ... )
+
+setup = Setup (;
+ x,
+ boundary_conditions = (( DirichletBC (), DirichletBC ()), ( DirichletBC (), DirichletBC ())),
+ Re = 1 / temperature . α1,
+ temperature,
+ backend,
+);
+
+ustart = velocityfield (setup, (dim, x, y) -> zero (x));
+tempstart = temperaturefield (setup, (x, y) -> one (y) / 2 + max ( sinpi ( 20 * x) / 100 , 0 ));
+
+GLMakie . closeall ()
+processors = (;
+ rtp = realtimeplotter (;
+ screen = GLMakie . Screen (),
+ setup,
+ fieldname = :temperature ,
+ colorrange = ( T ( 0 ), T ( 1 )),
+ size = ( 600 , 350 ),
+ colormap = :seaborn_icefire_gradient ,
+ nupdate = 20 ,
+ ),
+ nusselt = realtimeplotter (;
+ screen = GLMakie . Screen (),
+ setup,
+ plot = nusseltplot,
+ nupdate = 20 ,
+ ),
+ avg = realtimeplotter (;
+ screen = GLMakie . Screen (),
+ setup,
+ plot = averagetemp,
+ nupdate = 50 ,
+ ),
+ log = timelogger (; nupdate = 1000 ),
+)
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 20 )),
+ Δt = T ( 1e-2 ),
+ processors,
+);
+
+outputs . nusselt
+
+outputs . avg
This page was generated using Literate.jl .
`,46)]))}const c=i(e,[["render",E]]);export{C as __pageData,c as default};
diff --git a/previews/PR126/assets/examples_generated_RayleighBenard2D.md.DlQrJFaM.lean.js b/previews/PR126/assets/examples_generated_RayleighBenard2D.md.DlQrJFaM.lean.js
new file mode 100644
index 00000000..8bc9b654
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_RayleighBenard2D.md.DlQrJFaM.lean.js
@@ -0,0 +1,222 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const t="/IncompressibleNavierStokes.jl/previews/PR126/assets/cuibxhd.BxypEGK2.png",l="/IncompressibleNavierStokes.jl/previews/PR126/RayleighBenard2D.mp4",k="/IncompressibleNavierStokes.jl/previews/PR126/assets/xsmunma.C3CW_rGA.png",p="/IncompressibleNavierStokes.jl/previews/PR126/assets/jqxyinv.D8geYuhY.png",C=JSON.parse('{"title":"Rayleigh-Bénard convection (2D)","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/RayleighBenard2D.md","filePath":"examples/generated/RayleighBenard2D.md","lastUpdated":null}'),e={name:"examples/generated/RayleighBenard2D.md"};function E(r,s,d,g,y,F){return h(),a("div",null,s[0]||(s[0]=[n(`Rayleigh-Bénard convection (2D) A hot and a cold plate generate a convection cell in a box.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory for saving results
julia outdir = joinpath ( @__DIR__ , "output" , "RayleighBenard2D" )
"/home/runner/work/IncompressibleNavierStokes.jl/IncompressibleNavierStokes.jl/docs/build/examples/generated/output/RayleighBenard2D"
Hardware
julia backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
Define observer function to track Nusselt numbers on top and bottom plates.
julia function nusseltplot (state; setup)
+ state isa Observable || (state = Observable (state))
+ (; Δ, Δu) = setup . grid
+ Δy1 = Δu[ 2 ][ 1 : 1 ] |> sum
+ Δy2 = Δu[ 2 ][ end - 1 : end - 1 ] |> sum
+
+ # Observe Nusselt numbers
+ Nu1 = Observable (Point2f[])
+ Nu2 = Observable (Point2f[])
+ on (state) do (; temp, t)
+ dTdy = @. (temp[:, 2 ] - temp[:, 1 ]) / Δy1
+ Nu = sum (( .- dTdy .* Δ[ 1 ])[ 2 : end - 1 ])
+ push! (Nu1[], Point2f (t, Nu))
+ dTdy = @. (temp[:, end - 1 ] - temp[:, end - 2 ]) / Δy2
+ Nu = sum (( .- dTdy .* Δ[ 1 ])[ 2 : end - 1 ])
+ push! (Nu2[], Point2f (t, Nu))
+ (Nu1, Nu2) .|> notify ## Update plot
+ end
+
+ # Plot Nu history
+ fig = Figure ()
+ ax = Axis (fig[ 1 , 1 ]; title = "Nusselt number" , xlabel = "t" , ylabel = "Nu" )
+ lines! (ax, Nu1; label = "Lower plate" )
+ lines! (ax, Nu2; label = "Upper plate" )
+ axislegend (ax)
+ on (_ -> autolimits! (ax), Nu2)
+ fig
+end
nusseltplot (generic function with 1 method)
Define observer function to track average temperature.
julia function averagetemp (state; setup)
+ state isa Observable || (state = Observable (state))
+ (; xp, Δ, Ip) = setup . grid
+ ix = Ip . indices[ 1 ]
+ Ty = lift (state) do (; temp)
+ Ty = sum (temp[ix, :] .* Δ[ 1 ][ix]; dims = 1 ) ./ sum (Δ[ 1 ][ix])
+ Array (Ty)[:]
+ end
+ Ty0 = copy (Ty[])
+ yy = Array (xp[ 2 ])
+ fig = Figure ()
+ ax = Axis (fig[ 1 , 1 ]; title = "Average temperature" , xlabel = "T" , ylabel = "y" )
+ lines! (ax, Ty0, yy; label = "t = 0" )
+ lines! (ax, Ty, yy; label = "t = t" )
+ axislegend (ax)
+ on (_ -> autolimits! (ax), Ty)
+ fig
+end
averagetemp (generic function with 1 method)
Instabilities should depend on the floating point precision. Try both Float32
and Float64
.
Temperature equation setup.
julia temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e7 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (
+ ( SymmetricBC (), SymmetricBC ()),
+ ( DirichletBC ( T ( 1 )), DirichletBC ( T ( 0 ))),
+ ),
+ gdir = 2 ,
+ nondim_type = 1 ,
+)
(α1 = 0.00026645826f0, α2 = 1.0f0, α3 = 0.00026645826f0, α4 = 0.0003752933f0, γ = 1.0f0, dodissipation = true, boundary_conditions = ((SymmetricBC(), SymmetricBC()), (DirichletBC{Float32}(1.0f0), DirichletBC{Float32}(0.0f0))), gdir = 2)
Grid
julia n = 100
+x = tanh_grid ( T ( 0 ), T ( 2 ), 2 n, T ( 1.2 )), tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.2 ))
+plotgrid (x ... )
Setup
julia setup = Setup (;
+ x,
+ boundary_conditions = (( DirichletBC (), DirichletBC ()), ( DirichletBC (), DirichletBC ())),
+ Re = 1 / temperature . α1,
+ temperature,
+ backend,
+);
Initial conditions
julia ustart = velocityfield (setup, (dim, x, y) -> zero (x));
+tempstart = temperaturefield (setup, (x, y) -> one (y) / 2 + max ( sinpi ( 20 * x) / 100 , 0 ));
Processors
julia processors = (;
+ rtp = realtimeplotter (;
+ setup,
+ fieldname = :temperature ,
+ colorrange = ( T ( 0 ), T ( 1 )),
+ size = ( 600 , 350 ),
+ colormap = :seaborn_icefire_gradient ,
+ nupdate = 20 ,
+ ),
+ nusselt = realtimeplotter (;
+ setup,
+ plot = nusseltplot,
+ nupdate = 20 ,
+ ),
+ avg = realtimeplotter (;
+ setup,
+ plot = averagetemp,
+ nupdate = 50 ,
+ ),
+ log = timelogger (; nupdate = 1000 ),
+)
(rtp = (initialize = IncompressibleNavierStokesMakieExt.var"#10#12"{@NamedTuple{grid::@NamedTuple{xlims::Tuple{Tuple{Float32, Float32}, Tuple{Float32, Float32}}, dimension::IncompressibleNavierStokes.Dimension{2}, N::Tuple{Int64, Int64}, Nu::Tuple{Tuple{Int64, Int64}, Tuple{Int64, Int64}}, Np::Tuple{Int64, Int64}, Iu::Tuple{CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}, CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}}, Ip::CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}, x::Tuple{Vector{Float32}, Vector{Float32}}, xu::Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}, xp::Tuple{Vector{Float32}, Vector{Float32}}, Δ::Tuple{Vector{Float32}, Vector{Float32}}, Δu::Tuple{Vector{Float32}, Vector{Float32}}, A::Tuple{Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}, Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}}}, boundary_conditions::Tuple{Tuple{DirichletBC{Nothing}, DirichletBC{Nothing}}, Tuple{DirichletBC{Nothing}, DirichletBC{Nothing}}}, Re::Float32, bodyforce::Nothing, issteadybodyforce::Bool, closure_model::Nothing, backend::CPU, workgroupsize::Int64, temperature::@NamedTuple{α1::Float32, α2::Float32, α3::Float32, α4::Float32, γ::Float32, dodissipation::Bool, boundary_conditions::Tuple{Tuple{SymmetricBC, SymmetricBC}, Tuple{DirichletBC{Float32}, DirichletBC{Float32}}}, gdir::Int64}}, typeof(fieldplot), Int64, Bool, Nothing, Bool, Nothing, Base.Pairs{Symbol, Any, NTuple{4, Symbol}, @NamedTuple{fieldname::Symbol, colorrange::Tuple{Float32, Float32}, size::Tuple{Int64, Int64}, colormap::Symbol}}}((grid = (xlims = ((0.0f0, 2.0f0), (0.0f0, 1.0f0)), dimension = IncompressibleNavierStokes.Dimension{2}(), N = (202, 102), Nu = ((199, 100), (200, 99)), Np = (200, 100), Iu = (CartesianIndices((2:200, 2:101)), CartesianIndices((2:201, 2:100))), Ip = CartesianIndices((2:201, 2:101)), x = (Float32[0.0, 0.0, 0.0044347644, 0.008958757, 0.0135733485, 0.01827985, 0.023079693, 0.027974367, 0.032965183, 0.038053393 … 1.9619466, 1.9670348, 1.9720256, 1.9769204, 1.9817202, 1.9864266, 1.9910412, 1.9955652, 2.0, 2.0], Float32[0.0, 0.0, 0.0044793785, 0.009139925, 0.013987184, 0.019026697, 0.024263948, 0.029704452, 0.03535363, 0.04121679 … 0.9587832, 0.96464634, 0.97029555, 0.975736, 0.9809733, 0.9860128, 0.9908601, 0.9955206, 1.0, 1.0]), xu = ((Float32[0.0, 0.0044347644, 0.008958757, 0.0135733485, 0.01827985, 0.023079693, 0.027974367, 0.032965183, 0.038053393, 0.043240547 … 1.9619466, 1.9670348, 1.9720256, 1.9769204, 1.9817202, 1.9864266, 1.9910412, 1.9955652, 2.0, 2.0], Float32[0.0, 0.0022396892, 0.006809652, 0.011563554, 0.01650694, 0.021645322, 0.0269842, 0.03252904, 0.03828521, 0.044257984 … 0.955742, 0.96171474, 0.96747094, 0.9730158, 0.9783547, 0.9834931, 0.98843646, 0.99319035, 0.9977603, 1.0]), (Float32[0.0, 0.0022173822, 0.0066967607, 0.011266053, 0.0159266, 0.020679772, 0.02552703, 0.030469775, 0.03550929, 0.04064697 … 1.959353, 1.9644907, 1.9695302, 1.974473, 1.9793203, 1.9840734, 1.9887339, 1.9933032, 1.9977826, 2.0], Float32[0.0, 0.0044793785, 0.009139925, 0.013987184, 0.019026697, 0.024263948, 0.029704452, 0.03535363, 0.04121679, 0.047299176 … 0.9587832, 0.96464634, 0.97029555, 0.975736, 0.9809733, 0.9860128, 0.9908601, 0.9955206, 1.0, 1.0])), xp = (Float32[0.0, 0.0022173822, 0.0066967607, 0.011266053, 0.0159266, 0.020679772, 0.02552703, 0.030469775, 0.03550929, 0.04064697 … 1.959353, 1.9644907, 1.9695302, 1.974473, 1.9793203, 1.9840734, 1.9887339, 1.9933032, 1.9977826, 2.0], Float32[0.0, 0.0022396892, 0.006809652, 0.011563554, 0.01650694, 0.021645322, 0.0269842, 0.03252904, 0.03828521, 0.044257984 … 0.955742, 0.96171474, 0.96747094, 0.9730158, 0.9783547, 0.9834931, 0.98843646, 0.99319035, 0.9977603, 1.0]), Δ = (Float32[1.1920929f-7, 0.0044347644, 0.0045239925, 0.0046145916, 0.004706502, 0.004799843, 0.004894674, 0.004990816, 0.00508821, 0.005187154 … 0.005187154, 0.00508821, 0.004990816, 0.0048947334, 0.004799843, 0.0047063828, 0.0046145916, 0.0045239925, 0.004434824, 1.1920929f-7], Float32[1.1920929f-7, 0.0044793785, 0.004660547, 0.0048472583, 0.005039513, 0.0052372515, 0.0054405034, 0.005649179, 0.00586316, 0.006082386 … 0.006082356, 0.00586313, 0.005649209, 0.0054404736, 0.0052372813, 0.005039513, 0.004847288, 0.004660487, 0.0044794083, 1.1920929f-7]), Δu = (Float32[0.0022173822, 0.0044793785, 0.004569292, 0.004660547, 0.0047531724, 0.0048472583, 0.004942745, 0.005039513, 0.005137682, 0.0052372515 … 0.005137682, 0.0050395727, 0.004942775, 0.004847288, 0.004753113, 0.004660487, 0.004569292, 0.0044794083, 0.002217412, 1.1920929f-7], Float32[0.0022396892, 0.0045699626, 0.0047539026, 0.0049433857, 0.0051383823, 0.0053388774, 0.0055448413, 0.0057561696, 0.005972773, 0.0061945915 … 0.005972743, 0.0057561994, 0.0055448413, 0.0053389072, 0.005138397, 0.004943371, 0.0047538877, 0.0045699477, 0.0022397041, 1.1920929f-7]), A = (((Float32[1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], Float32[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), (Float32[1.0, 1.0, 0.5099108, 0.50981885, 0.5097228, 0.50962067, 0.50951755, 0.5094086, 0.50929356, 0.509176 … 0.49093604, 0.49081892, 0.4907065, 0.49058872, 0.4904881, 0.49038374, 0.49028164, 0.49017644, 0.49009407, 0.0], Float32[0.0, 0.49008918, 0.49018115, 0.49027717, 0.49037933, 0.49048245, 0.49059144, 0.49070647, 0.49082395, 0.49094325 … 0.5091811, 0.5092935, 0.5094113, 0.5095119, 0.50961626, 0.50971836, 0.50982356, 0.50990593, 1.0, 1.0])), ((Float32[1.0, 1.0, 0.50497997, 0.50495696, 0.50493026, 0.5049094, 0.5048909, 0.5048628, 0.50483155, 0.5048146 … 0.49520862, 0.4951738, 0.4951626, 0.49514025, 0.49510598, 0.4950843, 0.49507612, 0.49504304, 0.49502343, 0.0], Float32[0.0, 0.49502006, 0.49504304, 0.49506977, 0.4950906, 0.49510905, 0.4951372, 0.49516848, 0.4951854, 0.49521717 … 0.5048262, 0.5048374, 0.50485975, 0.504894, 0.5049157, 0.5049239, 0.50495696, 0.5049766, 1.0, 1.0]), (Float32[1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], Float32[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])))), boundary_conditions = ((DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing)), (DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing))), Re = 3752.933f0, bodyforce = nothing, issteadybodyforce = false, closure_model = nothing, backend = CPU(false), workgroupsize = 64, temperature = (α1 = 0.00026645826f0, α2 = 1.0f0, α3 = 0.00026645826f0, α4 = 0.0003752933f0, γ = 1.0f0, dodissipation = true, boundary_conditions = ((SymmetricBC(), SymmetricBC()), (DirichletBC{Float32}(1.0f0), DirichletBC{Float32}(0.0f0))), gdir = 2)), IncompressibleNavierStokes.fieldplot, 20, true, nothing, false, nothing, Base.Pairs{Symbol, Any, NTuple{4, Symbol}, @NamedTuple{fieldname::Symbol, colorrange::Tuple{Float32, Float32}, size::Tuple{Int64, Int64}, colormap::Symbol}}(:fieldname => :temperature, :colorrange => (0.0f0, 1.0f0), :size => (600, 350), :colormap => :seaborn_icefire_gradient)), finalize = IncompressibleNavierStokes.var"#295#296"()), nusselt = (initialize = IncompressibleNavierStokesMakieExt.var"#10#12"{@NamedTuple{grid::@NamedTuple{xlims::Tuple{Tuple{Float32, Float32}, Tuple{Float32, Float32}}, dimension::IncompressibleNavierStokes.Dimension{2}, N::Tuple{Int64, Int64}, Nu::Tuple{Tuple{Int64, Int64}, Tuple{Int64, Int64}}, Np::Tuple{Int64, Int64}, Iu::Tuple{CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}, CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}}, Ip::CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}, x::Tuple{Vector{Float32}, Vector{Float32}}, xu::Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}, xp::Tuple{Vector{Float32}, Vector{Float32}}, Δ::Tuple{Vector{Float32}, Vector{Float32}}, Δu::Tuple{Vector{Float32}, Vector{Float32}}, A::Tuple{Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}, Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}}}, boundary_conditions::Tuple{Tuple{DirichletBC{Nothing}, DirichletBC{Nothing}}, Tuple{DirichletBC{Nothing}, DirichletBC{Nothing}}}, Re::Float32, bodyforce::Nothing, issteadybodyforce::Bool, closure_model::Nothing, backend::CPU, workgroupsize::Int64, temperature::@NamedTuple{α1::Float32, α2::Float32, α3::Float32, α4::Float32, γ::Float32, dodissipation::Bool, boundary_conditions::Tuple{Tuple{SymmetricBC, SymmetricBC}, Tuple{DirichletBC{Float32}, DirichletBC{Float32}}}, gdir::Int64}}, typeof(Main.nusseltplot), Int64, Bool, Nothing, Bool, Nothing, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}}((grid = (xlims = ((0.0f0, 2.0f0), (0.0f0, 1.0f0)), dimension = IncompressibleNavierStokes.Dimension{2}(), N = (202, 102), Nu = ((199, 100), (200, 99)), Np = (200, 100), Iu = (CartesianIndices((2:200, 2:101)), CartesianIndices((2:201, 2:100))), Ip = CartesianIndices((2:201, 2:101)), x = (Float32[0.0, 0.0, 0.0044347644, 0.008958757, 0.0135733485, 0.01827985, 0.023079693, 0.027974367, 0.032965183, 0.038053393 … 1.9619466, 1.9670348, 1.9720256, 1.9769204, 1.9817202, 1.9864266, 1.9910412, 1.9955652, 2.0, 2.0], Float32[0.0, 0.0, 0.0044793785, 0.009139925, 0.013987184, 0.019026697, 0.024263948, 0.029704452, 0.03535363, 0.04121679 … 0.9587832, 0.96464634, 0.97029555, 0.975736, 0.9809733, 0.9860128, 0.9908601, 0.9955206, 1.0, 1.0]), xu = ((Float32[0.0, 0.0044347644, 0.008958757, 0.0135733485, 0.01827985, 0.023079693, 0.027974367, 0.032965183, 0.038053393, 0.043240547 … 1.9619466, 1.9670348, 1.9720256, 1.9769204, 1.9817202, 1.9864266, 1.9910412, 1.9955652, 2.0, 2.0], Float32[0.0, 0.0022396892, 0.006809652, 0.011563554, 0.01650694, 0.021645322, 0.0269842, 0.03252904, 0.03828521, 0.044257984 … 0.955742, 0.96171474, 0.96747094, 0.9730158, 0.9783547, 0.9834931, 0.98843646, 0.99319035, 0.9977603, 1.0]), (Float32[0.0, 0.0022173822, 0.0066967607, 0.011266053, 0.0159266, 0.020679772, 0.02552703, 0.030469775, 0.03550929, 0.04064697 … 1.959353, 1.9644907, 1.9695302, 1.974473, 1.9793203, 1.9840734, 1.9887339, 1.9933032, 1.9977826, 2.0], Float32[0.0, 0.0044793785, 0.009139925, 0.013987184, 0.019026697, 0.024263948, 0.029704452, 0.03535363, 0.04121679, 0.047299176 … 0.9587832, 0.96464634, 0.97029555, 0.975736, 0.9809733, 0.9860128, 0.9908601, 0.9955206, 1.0, 1.0])), xp = (Float32[0.0, 0.0022173822, 0.0066967607, 0.011266053, 0.0159266, 0.020679772, 0.02552703, 0.030469775, 0.03550929, 0.04064697 … 1.959353, 1.9644907, 1.9695302, 1.974473, 1.9793203, 1.9840734, 1.9887339, 1.9933032, 1.9977826, 2.0], Float32[0.0, 0.0022396892, 0.006809652, 0.011563554, 0.01650694, 0.021645322, 0.0269842, 0.03252904, 0.03828521, 0.044257984 … 0.955742, 0.96171474, 0.96747094, 0.9730158, 0.9783547, 0.9834931, 0.98843646, 0.99319035, 0.9977603, 1.0]), Δ = (Float32[1.1920929f-7, 0.0044347644, 0.0045239925, 0.0046145916, 0.004706502, 0.004799843, 0.004894674, 0.004990816, 0.00508821, 0.005187154 … 0.005187154, 0.00508821, 0.004990816, 0.0048947334, 0.004799843, 0.0047063828, 0.0046145916, 0.0045239925, 0.004434824, 1.1920929f-7], Float32[1.1920929f-7, 0.0044793785, 0.004660547, 0.0048472583, 0.005039513, 0.0052372515, 0.0054405034, 0.005649179, 0.00586316, 0.006082386 … 0.006082356, 0.00586313, 0.005649209, 0.0054404736, 0.0052372813, 0.005039513, 0.004847288, 0.004660487, 0.0044794083, 1.1920929f-7]), Δu = (Float32[0.0022173822, 0.0044793785, 0.004569292, 0.004660547, 0.0047531724, 0.0048472583, 0.004942745, 0.005039513, 0.005137682, 0.0052372515 … 0.005137682, 0.0050395727, 0.004942775, 0.004847288, 0.004753113, 0.004660487, 0.004569292, 0.0044794083, 0.002217412, 1.1920929f-7], Float32[0.0022396892, 0.0045699626, 0.0047539026, 0.0049433857, 0.0051383823, 0.0053388774, 0.0055448413, 0.0057561696, 0.005972773, 0.0061945915 … 0.005972743, 0.0057561994, 0.0055448413, 0.0053389072, 0.005138397, 0.004943371, 0.0047538877, 0.0045699477, 0.0022397041, 1.1920929f-7]), A = (((Float32[1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], Float32[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), (Float32[1.0, 1.0, 0.5099108, 0.50981885, 0.5097228, 0.50962067, 0.50951755, 0.5094086, 0.50929356, 0.509176 … 0.49093604, 0.49081892, 0.4907065, 0.49058872, 0.4904881, 0.49038374, 0.49028164, 0.49017644, 0.49009407, 0.0], Float32[0.0, 0.49008918, 0.49018115, 0.49027717, 0.49037933, 0.49048245, 0.49059144, 0.49070647, 0.49082395, 0.49094325 … 0.5091811, 0.5092935, 0.5094113, 0.5095119, 0.50961626, 0.50971836, 0.50982356, 0.50990593, 1.0, 1.0])), ((Float32[1.0, 1.0, 0.50497997, 0.50495696, 0.50493026, 0.5049094, 0.5048909, 0.5048628, 0.50483155, 0.5048146 … 0.49520862, 0.4951738, 0.4951626, 0.49514025, 0.49510598, 0.4950843, 0.49507612, 0.49504304, 0.49502343, 0.0], Float32[0.0, 0.49502006, 0.49504304, 0.49506977, 0.4950906, 0.49510905, 0.4951372, 0.49516848, 0.4951854, 0.49521717 … 0.5048262, 0.5048374, 0.50485975, 0.504894, 0.5049157, 0.5049239, 0.50495696, 0.5049766, 1.0, 1.0]), (Float32[1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], Float32[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])))), boundary_conditions = ((DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing)), (DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing))), Re = 3752.933f0, bodyforce = nothing, issteadybodyforce = false, closure_model = nothing, backend = CPU(false), workgroupsize = 64, temperature = (α1 = 0.00026645826f0, α2 = 1.0f0, α3 = 0.00026645826f0, α4 = 0.0003752933f0, γ = 1.0f0, dodissipation = true, boundary_conditions = ((SymmetricBC(), SymmetricBC()), (DirichletBC{Float32}(1.0f0), DirichletBC{Float32}(0.0f0))), gdir = 2)), Main.nusseltplot, 20, true, nothing, false, nothing, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}()), finalize = IncompressibleNavierStokes.var"#295#296"()), avg = (initialize = IncompressibleNavierStokesMakieExt.var"#10#12"{@NamedTuple{grid::@NamedTuple{xlims::Tuple{Tuple{Float32, Float32}, Tuple{Float32, Float32}}, dimension::IncompressibleNavierStokes.Dimension{2}, N::Tuple{Int64, Int64}, Nu::Tuple{Tuple{Int64, Int64}, Tuple{Int64, Int64}}, Np::Tuple{Int64, Int64}, Iu::Tuple{CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}, CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}}, Ip::CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}, x::Tuple{Vector{Float32}, Vector{Float32}}, xu::Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}, xp::Tuple{Vector{Float32}, Vector{Float32}}, Δ::Tuple{Vector{Float32}, Vector{Float32}}, Δu::Tuple{Vector{Float32}, Vector{Float32}}, A::Tuple{Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}, Tuple{Tuple{Vector{Float32}, Vector{Float32}}, Tuple{Vector{Float32}, Vector{Float32}}}}}, boundary_conditions::Tuple{Tuple{DirichletBC{Nothing}, DirichletBC{Nothing}}, Tuple{DirichletBC{Nothing}, DirichletBC{Nothing}}}, Re::Float32, bodyforce::Nothing, issteadybodyforce::Bool, closure_model::Nothing, backend::CPU, workgroupsize::Int64, temperature::@NamedTuple{α1::Float32, α2::Float32, α3::Float32, α4::Float32, γ::Float32, dodissipation::Bool, boundary_conditions::Tuple{Tuple{SymmetricBC, SymmetricBC}, Tuple{DirichletBC{Float32}, DirichletBC{Float32}}}, gdir::Int64}}, typeof(Main.averagetemp), Int64, Bool, Nothing, Bool, Nothing, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}}((grid = (xlims = ((0.0f0, 2.0f0), (0.0f0, 1.0f0)), dimension = IncompressibleNavierStokes.Dimension{2}(), N = (202, 102), Nu = ((199, 100), (200, 99)), Np = (200, 100), Iu = (CartesianIndices((2:200, 2:101)), CartesianIndices((2:201, 2:100))), Ip = CartesianIndices((2:201, 2:101)), x = (Float32[0.0, 0.0, 0.0044347644, 0.008958757, 0.0135733485, 0.01827985, 0.023079693, 0.027974367, 0.032965183, 0.038053393 … 1.9619466, 1.9670348, 1.9720256, 1.9769204, 1.9817202, 1.9864266, 1.9910412, 1.9955652, 2.0, 2.0], Float32[0.0, 0.0, 0.0044793785, 0.009139925, 0.013987184, 0.019026697, 0.024263948, 0.029704452, 0.03535363, 0.04121679 … 0.9587832, 0.96464634, 0.97029555, 0.975736, 0.9809733, 0.9860128, 0.9908601, 0.9955206, 1.0, 1.0]), xu = ((Float32[0.0, 0.0044347644, 0.008958757, 0.0135733485, 0.01827985, 0.023079693, 0.027974367, 0.032965183, 0.038053393, 0.043240547 … 1.9619466, 1.9670348, 1.9720256, 1.9769204, 1.9817202, 1.9864266, 1.9910412, 1.9955652, 2.0, 2.0], Float32[0.0, 0.0022396892, 0.006809652, 0.011563554, 0.01650694, 0.021645322, 0.0269842, 0.03252904, 0.03828521, 0.044257984 … 0.955742, 0.96171474, 0.96747094, 0.9730158, 0.9783547, 0.9834931, 0.98843646, 0.99319035, 0.9977603, 1.0]), (Float32[0.0, 0.0022173822, 0.0066967607, 0.011266053, 0.0159266, 0.020679772, 0.02552703, 0.030469775, 0.03550929, 0.04064697 … 1.959353, 1.9644907, 1.9695302, 1.974473, 1.9793203, 1.9840734, 1.9887339, 1.9933032, 1.9977826, 2.0], Float32[0.0, 0.0044793785, 0.009139925, 0.013987184, 0.019026697, 0.024263948, 0.029704452, 0.03535363, 0.04121679, 0.047299176 … 0.9587832, 0.96464634, 0.97029555, 0.975736, 0.9809733, 0.9860128, 0.9908601, 0.9955206, 1.0, 1.0])), xp = (Float32[0.0, 0.0022173822, 0.0066967607, 0.011266053, 0.0159266, 0.020679772, 0.02552703, 0.030469775, 0.03550929, 0.04064697 … 1.959353, 1.9644907, 1.9695302, 1.974473, 1.9793203, 1.9840734, 1.9887339, 1.9933032, 1.9977826, 2.0], Float32[0.0, 0.0022396892, 0.006809652, 0.011563554, 0.01650694, 0.021645322, 0.0269842, 0.03252904, 0.03828521, 0.044257984 … 0.955742, 0.96171474, 0.96747094, 0.9730158, 0.9783547, 0.9834931, 0.98843646, 0.99319035, 0.9977603, 1.0]), Δ = (Float32[1.1920929f-7, 0.0044347644, 0.0045239925, 0.0046145916, 0.004706502, 0.004799843, 0.004894674, 0.004990816, 0.00508821, 0.005187154 … 0.005187154, 0.00508821, 0.004990816, 0.0048947334, 0.004799843, 0.0047063828, 0.0046145916, 0.0045239925, 0.004434824, 1.1920929f-7], Float32[1.1920929f-7, 0.0044793785, 0.004660547, 0.0048472583, 0.005039513, 0.0052372515, 0.0054405034, 0.005649179, 0.00586316, 0.006082386 … 0.006082356, 0.00586313, 0.005649209, 0.0054404736, 0.0052372813, 0.005039513, 0.004847288, 0.004660487, 0.0044794083, 1.1920929f-7]), Δu = (Float32[0.0022173822, 0.0044793785, 0.004569292, 0.004660547, 0.0047531724, 0.0048472583, 0.004942745, 0.005039513, 0.005137682, 0.0052372515 … 0.005137682, 0.0050395727, 0.004942775, 0.004847288, 0.004753113, 0.004660487, 0.004569292, 0.0044794083, 0.002217412, 1.1920929f-7], Float32[0.0022396892, 0.0045699626, 0.0047539026, 0.0049433857, 0.0051383823, 0.0053388774, 0.0055448413, 0.0057561696, 0.005972773, 0.0061945915 … 0.005972743, 0.0057561994, 0.0055448413, 0.0053389072, 0.005138397, 0.004943371, 0.0047538877, 0.0045699477, 0.0022397041, 1.1920929f-7]), A = (((Float32[1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], Float32[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), (Float32[1.0, 1.0, 0.5099108, 0.50981885, 0.5097228, 0.50962067, 0.50951755, 0.5094086, 0.50929356, 0.509176 … 0.49093604, 0.49081892, 0.4907065, 0.49058872, 0.4904881, 0.49038374, 0.49028164, 0.49017644, 0.49009407, 0.0], Float32[0.0, 0.49008918, 0.49018115, 0.49027717, 0.49037933, 0.49048245, 0.49059144, 0.49070647, 0.49082395, 0.49094325 … 0.5091811, 0.5092935, 0.5094113, 0.5095119, 0.50961626, 0.50971836, 0.50982356, 0.50990593, 1.0, 1.0])), ((Float32[1.0, 1.0, 0.50497997, 0.50495696, 0.50493026, 0.5049094, 0.5048909, 0.5048628, 0.50483155, 0.5048146 … 0.49520862, 0.4951738, 0.4951626, 0.49514025, 0.49510598, 0.4950843, 0.49507612, 0.49504304, 0.49502343, 0.0], Float32[0.0, 0.49502006, 0.49504304, 0.49506977, 0.4950906, 0.49510905, 0.4951372, 0.49516848, 0.4951854, 0.49521717 … 0.5048262, 0.5048374, 0.50485975, 0.504894, 0.5049157, 0.5049239, 0.50495696, 0.5049766, 1.0, 1.0]), (Float32[1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], Float32[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])))), boundary_conditions = ((DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing)), (DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing))), Re = 3752.933f0, bodyforce = nothing, issteadybodyforce = false, closure_model = nothing, backend = CPU(false), workgroupsize = 64, temperature = (α1 = 0.00026645826f0, α2 = 1.0f0, α3 = 0.00026645826f0, α4 = 0.0003752933f0, γ = 1.0f0, dodissipation = true, boundary_conditions = ((SymmetricBC(), SymmetricBC()), (DirichletBC{Float32}(1.0f0), DirichletBC{Float32}(0.0f0))), gdir = 2)), Main.averagetemp, 50, true, nothing, false, nothing, Base.Pairs{Symbol, Union{}, Tuple{}, @NamedTuple{}}()), finalize = IncompressibleNavierStokes.var"#295#296"()), log = (initialize = IncompressibleNavierStokes.var"#298#300"{Bool, Bool, Bool, Bool, Bool, Int64}(false, true, true, true, true, 1000), finalize = IncompressibleNavierStokes.var"#295#296"()))
Solve equation
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 20 )),
+ Δt = T ( 1e-2 ),
+ processors,
+);
[ Info: t = 10.0001 Δt = 0.01 umax = 0.24 itertime = 0.014
+[ Info: t = 20.0004 Δt = 0.01 umax = 0.55 itertime = 0.012
Nusselt numbers
Average temperature
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "RayleighBenard2D" )
+
+backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
+
+function nusseltplot (state; setup)
+ state isa Observable || (state = Observable (state))
+ (; Δ, Δu) = setup . grid
+ Δy1 = Δu[ 2 ][ 1 : 1 ] |> sum
+ Δy2 = Δu[ 2 ][ end - 1 : end - 1 ] |> sum
+
+ # Observe Nusselt numbers
+ Nu1 = Observable (Point2f[])
+ Nu2 = Observable (Point2f[])
+ on (state) do (; temp, t)
+ dTdy = @. (temp[:, 2 ] - temp[:, 1 ]) / Δy1
+ Nu = sum (( .- dTdy .* Δ[ 1 ])[ 2 : end - 1 ])
+ push! (Nu1[], Point2f (t, Nu))
+ dTdy = @. (temp[:, end - 1 ] - temp[:, end - 2 ]) / Δy2
+ Nu = sum (( .- dTdy .* Δ[ 1 ])[ 2 : end - 1 ])
+ push! (Nu2[], Point2f (t, Nu))
+ (Nu1, Nu2) .|> notify ## Update plot
+ end
+
+ # Plot Nu history
+ fig = Figure ()
+ ax = Axis (fig[ 1 , 1 ]; title = "Nusselt number" , xlabel = "t" , ylabel = "Nu" )
+ lines! (ax, Nu1; label = "Lower plate" )
+ lines! (ax, Nu2; label = "Upper plate" )
+ axislegend (ax)
+ on (_ -> autolimits! (ax), Nu2)
+ fig
+end
+
+function averagetemp (state; setup)
+ state isa Observable || (state = Observable (state))
+ (; xp, Δ, Ip) = setup . grid
+ ix = Ip . indices[ 1 ]
+ Ty = lift (state) do (; temp)
+ Ty = sum (temp[ix, :] .* Δ[ 1 ][ix]; dims = 1 ) ./ sum (Δ[ 1 ][ix])
+ Array (Ty)[:]
+ end
+ Ty0 = copy (Ty[])
+ yy = Array (xp[ 2 ])
+ fig = Figure ()
+ ax = Axis (fig[ 1 , 1 ]; title = "Average temperature" , xlabel = "T" , ylabel = "y" )
+ lines! (ax, Ty0, yy; label = "t = 0" )
+ lines! (ax, Ty, yy; label = "t = t" )
+ axislegend (ax)
+ on (_ -> autolimits! (ax), Ty)
+ fig
+end
+
+T = Float32
+
+temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e7 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (
+ ( SymmetricBC (), SymmetricBC ()),
+ ( DirichletBC ( T ( 1 )), DirichletBC ( T ( 0 ))),
+ ),
+ gdir = 2 ,
+ nondim_type = 1 ,
+)
+
+n = 100
+x = tanh_grid ( T ( 0 ), T ( 2 ), 2 n, T ( 1.2 )), tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.2 ))
+plotgrid (x ... )
+
+setup = Setup (;
+ x,
+ boundary_conditions = (( DirichletBC (), DirichletBC ()), ( DirichletBC (), DirichletBC ())),
+ Re = 1 / temperature . α1,
+ temperature,
+ backend,
+);
+
+ustart = velocityfield (setup, (dim, x, y) -> zero (x));
+tempstart = temperaturefield (setup, (x, y) -> one (y) / 2 + max ( sinpi ( 20 * x) / 100 , 0 ));
+
+GLMakie . closeall ()
+processors = (;
+ rtp = realtimeplotter (;
+ screen = GLMakie . Screen (),
+ setup,
+ fieldname = :temperature ,
+ colorrange = ( T ( 0 ), T ( 1 )),
+ size = ( 600 , 350 ),
+ colormap = :seaborn_icefire_gradient ,
+ nupdate = 20 ,
+ ),
+ nusselt = realtimeplotter (;
+ screen = GLMakie . Screen (),
+ setup,
+ plot = nusseltplot,
+ nupdate = 20 ,
+ ),
+ avg = realtimeplotter (;
+ screen = GLMakie . Screen (),
+ setup,
+ plot = averagetemp,
+ nupdate = 50 ,
+ ),
+ log = timelogger (; nupdate = 1000 ),
+)
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 20 )),
+ Δt = T ( 1e-2 ),
+ processors,
+);
+
+outputs . nusselt
+
+outputs . avg
This page was generated using Literate.jl .
`,46)]))}const c=i(e,[["render",E]]);export{C as __pageData,c as default};
diff --git a/previews/PR126/assets/examples_generated_RayleighBenard3D.md.BFDE04bU.js b/previews/PR126/assets/examples_generated_RayleighBenard3D.md.BFDE04bU.js
new file mode 100644
index 00000000..7adb714e
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_RayleighBenard3D.md.BFDE04bU.js
@@ -0,0 +1,174 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Rayleigh-Bénard convection (3D)","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/RayleighBenard3D.md","filePath":"examples/generated/RayleighBenard3D.md","lastUpdated":null}'),k={name:"examples/generated/RayleighBenard3D.md"};function l(p,s,t,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Rayleigh-Bénard convection (3D) A hot and a cold plate generate a convection cell in a box.
julia using CairoMakie
+using IncompressibleNavierStokes
Hardware
julia backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
Precision
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "RayleighBenard3D" )
Temperature equation
julia temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e7 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (
+ ( PeriodicBC (), PeriodicBC ()),
+ ( SymmetricBC (), SymmetricBC ()),
+ ( DirichletBC ( T ( 1 )), DirichletBC ( T ( 0 ))),
+ ),
+ gdir = 3 ,
+ nondim_type = 1 ,
+)
Setup
julia n = 60
+x = (
+ LinRange ( T ( 0 ), T ( π ), 2 n),
+ tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.2 )),
+ tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.2 )),
+)
+setup = Setup (;
+ x,
+ boundary_conditions = (
+ ( PeriodicBC (), PeriodicBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ),
+ Re = 1 / temperature . α1,
+ temperature,
+ backend,
+);
+
+plotgrid (x[ 1 ], x[ 2 ])
+plotgrid (x[ 2 ], x[ 3 ])
This will factorize the Laplace matrix
julia @time psolver = psolver_direct (setup)
Initial conditions
julia ustart = velocityfield (setup, (dim, x, y, z) -> zero (x); psolver);
+tempstart =
+ temperaturefield (setup, (x, y, z) -> one (x) / 2 + sin ( 20 * x) * sinpi ( 20 * y) / 100 );
+nothing #hide
Solve equation
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 10 )),
+ method = RKMethods . RK33C2 (; T),
+ # Δt = T(1e-2),
+ psolver,
+ processors = (;
+ # anim = animator(;
+ # path = "$outdir/RB3D.mp4",
+ rtp = realtimeplotter (;
+ setup,
+ nupdate = 1 ,
+ levels = LinRange ( - T ( 5 ), T ( 1 ), 10 ),
+ fieldname = :eig2field ,
+ # levels = LinRange{T}(0.01, 0.99, 10),
+ # fieldname = :temperature,
+ ),
+ # vtk = vtk_writer(;
+ # setup,
+ # dir = joinpath(outdir, "RB3D_$n"),
+ # nupdate = 20,
+ # ## fieldnames = (:velocity, :temperature, :eig2field)
+ # fieldnames = (:temperature,),
+ # ),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+field = IncompressibleNavierStokes . eig2field (state . u, setup)[setup . grid . Ip]
+hist ( vec ( Array ( log .( max .( eps (T), .- field)))))
+
+fieldplot (
+ # (; u = ustart, temp = tempstart, t = T(0));
+ state;
+ setup,
+ levels = LinRange{T} ( 0.5 , 2 , 5 ),
+ # levels = LinRange(-T(5), T(1), 10),
+ # fieldname = :eig2field,
+ fieldname = :temperature ,
+)
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
+
+T = Float32
+
+outdir = joinpath ( @__DIR__ , "output" , "RayleighBenard3D" )
+
+temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e7 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (
+ ( PeriodicBC (), PeriodicBC ()),
+ ( SymmetricBC (), SymmetricBC ()),
+ ( DirichletBC ( T ( 1 )), DirichletBC ( T ( 0 ))),
+ ),
+ gdir = 3 ,
+ nondim_type = 1 ,
+)
+
+n = 60
+x = (
+ LinRange ( T ( 0 ), T ( π ), 2 n),
+ tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.2 )),
+ tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.2 )),
+)
+setup = Setup (;
+ x,
+ boundary_conditions = (
+ ( PeriodicBC (), PeriodicBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ),
+ Re = 1 / temperature . α1,
+ temperature,
+ backend,
+);
+
+plotgrid (x[ 1 ], x[ 2 ])
+plotgrid (x[ 2 ], x[ 3 ])
+
+@time psolver = psolver_direct (setup)
+
+ustart = velocityfield (setup, (dim, x, y, z) -> zero (x); psolver);
+tempstart =
+ temperaturefield (setup, (x, y, z) -> one (x) / 2 + sin ( 20 * x) * sinpi ( 20 * y) / 100 );
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 10 )),
+ method = RKMethods . RK33C2 (; T),
+ # Δt = T(1e-2),
+ psolver,
+ processors = (;
+ # anim = animator(;
+ # path = "$outdir/RB3D.mp4",
+ rtp = realtimeplotter (;
+ setup,
+ nupdate = 1 ,
+ levels = LinRange ( - T ( 5 ), T ( 1 ), 10 ),
+ fieldname = :eig2field ,
+ # levels = LinRange{T}(0.01, 0.99, 10),
+ # fieldname = :temperature,
+ ),
+ # vtk = vtk_writer(;
+ # setup,
+ # dir = joinpath(outdir, "RB3D_$n"),
+ # nupdate = 20,
+ # ## fieldnames = (:velocity, :temperature, :eig2field)
+ # fieldnames = (:temperature,),
+ # ),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+field = IncompressibleNavierStokes . eig2field (state . u, setup)[setup . grid . Ip]
+hist ( vec ( Array ( log .( max .( eps (T), .- field)))))
+
+fieldplot (
+ # (; u = ustart, temp = tempstart, t = T(0));
+ state;
+ setup,
+ levels = LinRange{T} ( 0.5 , 2 , 5 ),
+ # levels = LinRange(-T(5), T(1), 10),
+ # fieldname = :eig2field,
+ fieldname = :temperature ,
+)
This page was generated using Literate.jl .
`,25)]))}const y=i(k,[["render",l]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_RayleighBenard3D.md.BFDE04bU.lean.js b/previews/PR126/assets/examples_generated_RayleighBenard3D.md.BFDE04bU.lean.js
new file mode 100644
index 00000000..7adb714e
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_RayleighBenard3D.md.BFDE04bU.lean.js
@@ -0,0 +1,174 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Rayleigh-Bénard convection (3D)","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/RayleighBenard3D.md","filePath":"examples/generated/RayleighBenard3D.md","lastUpdated":null}'),k={name:"examples/generated/RayleighBenard3D.md"};function l(p,s,t,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Rayleigh-Bénard convection (3D) A hot and a cold plate generate a convection cell in a box.
julia using CairoMakie
+using IncompressibleNavierStokes
Hardware
julia backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
Precision
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "RayleighBenard3D" )
Temperature equation
julia temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e7 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (
+ ( PeriodicBC (), PeriodicBC ()),
+ ( SymmetricBC (), SymmetricBC ()),
+ ( DirichletBC ( T ( 1 )), DirichletBC ( T ( 0 ))),
+ ),
+ gdir = 3 ,
+ nondim_type = 1 ,
+)
Setup
julia n = 60
+x = (
+ LinRange ( T ( 0 ), T ( π ), 2 n),
+ tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.2 )),
+ tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.2 )),
+)
+setup = Setup (;
+ x,
+ boundary_conditions = (
+ ( PeriodicBC (), PeriodicBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ),
+ Re = 1 / temperature . α1,
+ temperature,
+ backend,
+);
+
+plotgrid (x[ 1 ], x[ 2 ])
+plotgrid (x[ 2 ], x[ 3 ])
This will factorize the Laplace matrix
julia @time psolver = psolver_direct (setup)
Initial conditions
julia ustart = velocityfield (setup, (dim, x, y, z) -> zero (x); psolver);
+tempstart =
+ temperaturefield (setup, (x, y, z) -> one (x) / 2 + sin ( 20 * x) * sinpi ( 20 * y) / 100 );
+nothing #hide
Solve equation
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 10 )),
+ method = RKMethods . RK33C2 (; T),
+ # Δt = T(1e-2),
+ psolver,
+ processors = (;
+ # anim = animator(;
+ # path = "$outdir/RB3D.mp4",
+ rtp = realtimeplotter (;
+ setup,
+ nupdate = 1 ,
+ levels = LinRange ( - T ( 5 ), T ( 1 ), 10 ),
+ fieldname = :eig2field ,
+ # levels = LinRange{T}(0.01, 0.99, 10),
+ # fieldname = :temperature,
+ ),
+ # vtk = vtk_writer(;
+ # setup,
+ # dir = joinpath(outdir, "RB3D_$n"),
+ # nupdate = 20,
+ # ## fieldnames = (:velocity, :temperature, :eig2field)
+ # fieldnames = (:temperature,),
+ # ),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+field = IncompressibleNavierStokes . eig2field (state . u, setup)[setup . grid . Ip]
+hist ( vec ( Array ( log .( max .( eps (T), .- field)))))
+
+fieldplot (
+ # (; u = ustart, temp = tempstart, t = T(0));
+ state;
+ setup,
+ levels = LinRange{T} ( 0.5 , 2 , 5 ),
+ # levels = LinRange(-T(5), T(1), 10),
+ # fieldname = :eig2field,
+ fieldname = :temperature ,
+)
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
+
+T = Float32
+
+outdir = joinpath ( @__DIR__ , "output" , "RayleighBenard3D" )
+
+temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e7 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (
+ ( PeriodicBC (), PeriodicBC ()),
+ ( SymmetricBC (), SymmetricBC ()),
+ ( DirichletBC ( T ( 1 )), DirichletBC ( T ( 0 ))),
+ ),
+ gdir = 3 ,
+ nondim_type = 1 ,
+)
+
+n = 60
+x = (
+ LinRange ( T ( 0 ), T ( π ), 2 n),
+ tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.2 )),
+ tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.2 )),
+)
+setup = Setup (;
+ x,
+ boundary_conditions = (
+ ( PeriodicBC (), PeriodicBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ),
+ Re = 1 / temperature . α1,
+ temperature,
+ backend,
+);
+
+plotgrid (x[ 1 ], x[ 2 ])
+plotgrid (x[ 2 ], x[ 3 ])
+
+@time psolver = psolver_direct (setup)
+
+ustart = velocityfield (setup, (dim, x, y, z) -> zero (x); psolver);
+tempstart =
+ temperaturefield (setup, (x, y, z) -> one (x) / 2 + sin ( 20 * x) * sinpi ( 20 * y) / 100 );
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 10 )),
+ method = RKMethods . RK33C2 (; T),
+ # Δt = T(1e-2),
+ psolver,
+ processors = (;
+ # anim = animator(;
+ # path = "$outdir/RB3D.mp4",
+ rtp = realtimeplotter (;
+ setup,
+ nupdate = 1 ,
+ levels = LinRange ( - T ( 5 ), T ( 1 ), 10 ),
+ fieldname = :eig2field ,
+ # levels = LinRange{T}(0.01, 0.99, 10),
+ # fieldname = :temperature,
+ ),
+ # vtk = vtk_writer(;
+ # setup,
+ # dir = joinpath(outdir, "RB3D_$n"),
+ # nupdate = 20,
+ # ## fieldnames = (:velocity, :temperature, :eig2field)
+ # fieldnames = (:temperature,),
+ # ),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+field = IncompressibleNavierStokes . eig2field (state . u, setup)[setup . grid . Ip]
+hist ( vec ( Array ( log .( max .( eps (T), .- field)))))
+
+fieldplot (
+ # (; u = ustart, temp = tempstart, t = T(0));
+ state;
+ setup,
+ levels = LinRange{T} ( 0.5 , 2 , 5 ),
+ # levels = LinRange(-T(5), T(1), 10),
+ # fieldname = :eig2field,
+ fieldname = :temperature ,
+)
This page was generated using Literate.jl .
`,25)]))}const y=i(k,[["render",l]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_RayleighTaylor2D.md.BS44XuaT.js b/previews/PR126/assets/examples_generated_RayleighTaylor2D.md.BS44XuaT.js
new file mode 100644
index 00000000..01eedddf
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_RayleighTaylor2D.md.BS44XuaT.js
@@ -0,0 +1,96 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const k="/IncompressibleNavierStokes.jl/previews/PR126/assets/kktjebp.C2NI-x6W.png",t="/IncompressibleNavierStokes.jl/previews/PR126/RayleighTaylor2D.mp4",F=JSON.parse('{"title":"Rayleigh-Taylor instability in 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/RayleighTaylor2D.md","filePath":"examples/generated/RayleighTaylor2D.md","lastUpdated":null}'),p={name:"examples/generated/RayleighTaylor2D.md"};function l(e,s,E,r,d,g){return h(),a("div",null,s[0]||(s[0]=[n(`Rayleigh-Taylor instability in 2D Two fluids with different temperatures start mixing.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory for saving results
julia outdir = joinpath ( @__DIR__ , "output" , "RayleighTaylor2D" )
"/home/runner/work/IncompressibleNavierStokes.jl/IncompressibleNavierStokes.jl/docs/build/examples/generated/output/RayleighTaylor2D"
Hardware
julia backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
Precision
Grid
julia n = 50
+x = tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.5 )), tanh_grid ( T ( 0 ), T ( 2 ), 2 n, T ( 1.5 ))
+plotgrid (x ... ; figure = (; size = ( 300 , 600 )))
Setup
julia temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e6 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (( SymmetricBC (), SymmetricBC ()), ( SymmetricBC (), SymmetricBC ())),
+ gdir = 2 ,
+ nondim_type = 1 ,
+)
+setup = Setup (;
+ x,
+ boundary_conditions = (( DirichletBC (), DirichletBC ()), ( DirichletBC (), DirichletBC ())),
+ Re = 1 / temperature . α1,
+ temperature,
+);
Initial conditions
julia ustart = velocityfield (setup, (dim, x, y) -> zero (x));
+tempstart = temperaturefield (setup, (x, y) -> one (x) * ( 1 + sinpi (x) / 50 > y));
Solve equation
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 10 )),
+ Δt = T ( 5e-3 ),
+ processors = (;
+ rtp = realtimeplotter (;
+ setup,
+ nupdate = 20 ,
+ fieldname = :temperature ,
+ size = ( 400 , 600 ),
+ ),
+ log = timelogger (; nupdate = 200 ),
+ ),
+);
[ Info: t = 1 Δt = 0.005 umax = 0.1 itertime = 0.011
+[ Info: t = 2 Δt = 0.005 umax = 0.32 itertime = 0.0032
+[ Info: t = 3 Δt = 0.005 umax = 0.78 itertime = 0.0032
+[ Info: t = 4 Δt = 0.005 umax = 0.75 itertime = 0.0033
+[ Info: t = 5 Δt = 0.005 umax = 0.78 itertime = 0.0032
+[ Info: t = 6 Δt = 0.005 umax = 0.84 itertime = 0.0032
+[ Info: t = 7 Δt = 0.005 umax = 0.84 itertime = 0.0032
+[ Info: t = 8 Δt = 0.005 umax = 0.89 itertime = 0.0032
+[ Info: t = 9 Δt = 0.005 umax = 1.2 itertime = 0.0033
+[ Info: t = 10 Δt = 0.005 umax = 0.88 itertime = 0.0033
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "RayleighTaylor2D" )
+
+backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
+
+T = Float64
+
+n = 50
+x = tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.5 )), tanh_grid ( T ( 0 ), T ( 2 ), 2 n, T ( 1.5 ))
+plotgrid (x ... ; figure = (; size = ( 300 , 600 )))
+
+temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e6 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (( SymmetricBC (), SymmetricBC ()), ( SymmetricBC (), SymmetricBC ())),
+ gdir = 2 ,
+ nondim_type = 1 ,
+)
+setup = Setup (;
+ x,
+ boundary_conditions = (( DirichletBC (), DirichletBC ()), ( DirichletBC (), DirichletBC ())),
+ Re = 1 / temperature . α1,
+ temperature,
+);
+
+ustart = velocityfield (setup, (dim, x, y) -> zero (x));
+tempstart = temperaturefield (setup, (x, y) -> one (x) * ( 1 + sinpi (x) / 50 > y));
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 10 )),
+ Δt = T ( 5e-3 ),
+ processors = (;
+ rtp = realtimeplotter (;
+ setup,
+ nupdate = 20 ,
+ fieldname = :temperature ,
+ size = ( 400 , 600 ),
+ ),
+ log = timelogger (; nupdate = 200 ),
+ ),
+);
This page was generated using Literate.jl .
`,28)]))}const C=i(p,[["render",l]]);export{F as __pageData,C as default};
diff --git a/previews/PR126/assets/examples_generated_RayleighTaylor2D.md.BS44XuaT.lean.js b/previews/PR126/assets/examples_generated_RayleighTaylor2D.md.BS44XuaT.lean.js
new file mode 100644
index 00000000..01eedddf
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_RayleighTaylor2D.md.BS44XuaT.lean.js
@@ -0,0 +1,96 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const k="/IncompressibleNavierStokes.jl/previews/PR126/assets/kktjebp.C2NI-x6W.png",t="/IncompressibleNavierStokes.jl/previews/PR126/RayleighTaylor2D.mp4",F=JSON.parse('{"title":"Rayleigh-Taylor instability in 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/RayleighTaylor2D.md","filePath":"examples/generated/RayleighTaylor2D.md","lastUpdated":null}'),p={name:"examples/generated/RayleighTaylor2D.md"};function l(e,s,E,r,d,g){return h(),a("div",null,s[0]||(s[0]=[n(`Rayleigh-Taylor instability in 2D Two fluids with different temperatures start mixing.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory for saving results
julia outdir = joinpath ( @__DIR__ , "output" , "RayleighTaylor2D" )
"/home/runner/work/IncompressibleNavierStokes.jl/IncompressibleNavierStokes.jl/docs/build/examples/generated/output/RayleighTaylor2D"
Hardware
julia backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
Precision
Grid
julia n = 50
+x = tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.5 )), tanh_grid ( T ( 0 ), T ( 2 ), 2 n, T ( 1.5 ))
+plotgrid (x ... ; figure = (; size = ( 300 , 600 )))
Setup
julia temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e6 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (( SymmetricBC (), SymmetricBC ()), ( SymmetricBC (), SymmetricBC ())),
+ gdir = 2 ,
+ nondim_type = 1 ,
+)
+setup = Setup (;
+ x,
+ boundary_conditions = (( DirichletBC (), DirichletBC ()), ( DirichletBC (), DirichletBC ())),
+ Re = 1 / temperature . α1,
+ temperature,
+);
Initial conditions
julia ustart = velocityfield (setup, (dim, x, y) -> zero (x));
+tempstart = temperaturefield (setup, (x, y) -> one (x) * ( 1 + sinpi (x) / 50 > y));
Solve equation
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 10 )),
+ Δt = T ( 5e-3 ),
+ processors = (;
+ rtp = realtimeplotter (;
+ setup,
+ nupdate = 20 ,
+ fieldname = :temperature ,
+ size = ( 400 , 600 ),
+ ),
+ log = timelogger (; nupdate = 200 ),
+ ),
+);
[ Info: t = 1 Δt = 0.005 umax = 0.1 itertime = 0.011
+[ Info: t = 2 Δt = 0.005 umax = 0.32 itertime = 0.0032
+[ Info: t = 3 Δt = 0.005 umax = 0.78 itertime = 0.0032
+[ Info: t = 4 Δt = 0.005 umax = 0.75 itertime = 0.0033
+[ Info: t = 5 Δt = 0.005 umax = 0.78 itertime = 0.0032
+[ Info: t = 6 Δt = 0.005 umax = 0.84 itertime = 0.0032
+[ Info: t = 7 Δt = 0.005 umax = 0.84 itertime = 0.0032
+[ Info: t = 8 Δt = 0.005 umax = 0.89 itertime = 0.0032
+[ Info: t = 9 Δt = 0.005 umax = 1.2 itertime = 0.0033
+[ Info: t = 10 Δt = 0.005 umax = 0.88 itertime = 0.0033
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "RayleighTaylor2D" )
+
+backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
+
+T = Float64
+
+n = 50
+x = tanh_grid ( T ( 0 ), T ( 1 ), n, T ( 1.5 )), tanh_grid ( T ( 0 ), T ( 2 ), 2 n, T ( 1.5 ))
+plotgrid (x ... ; figure = (; size = ( 300 , 600 )))
+
+temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e6 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (( SymmetricBC (), SymmetricBC ()), ( SymmetricBC (), SymmetricBC ())),
+ gdir = 2 ,
+ nondim_type = 1 ,
+)
+setup = Setup (;
+ x,
+ boundary_conditions = (( DirichletBC (), DirichletBC ()), ( DirichletBC (), DirichletBC ())),
+ Re = 1 / temperature . α1,
+ temperature,
+);
+
+ustart = velocityfield (setup, (dim, x, y) -> zero (x));
+tempstart = temperaturefield (setup, (x, y) -> one (x) * ( 1 + sinpi (x) / 50 > y));
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 10 )),
+ Δt = T ( 5e-3 ),
+ processors = (;
+ rtp = realtimeplotter (;
+ setup,
+ nupdate = 20 ,
+ fieldname = :temperature ,
+ size = ( 400 , 600 ),
+ ),
+ log = timelogger (; nupdate = 200 ),
+ ),
+);
This page was generated using Literate.jl .
`,28)]))}const C=i(p,[["render",l]]);export{F as __pageData,C as default};
diff --git a/previews/PR126/assets/examples_generated_RayleighTaylor3D.md.DNAhoUfj.js b/previews/PR126/assets/examples_generated_RayleighTaylor3D.md.DNAhoUfj.js
new file mode 100644
index 00000000..ce56f9c6
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_RayleighTaylor3D.md.DNAhoUfj.js
@@ -0,0 +1,161 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Rayleigh-Taylor instability in 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/RayleighTaylor3D.md","filePath":"examples/generated/RayleighTaylor3D.md","lastUpdated":null}'),k={name:"examples/generated/RayleighTaylor3D.md"};function l(p,s,t,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Rayleigh-Taylor instability in 2D Two fluids with different temperatures start mixing.
julia using CairoMakie
+using IncompressibleNavierStokes
Hardware
julia backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
Precision
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "RayleighTaylor3D" )
Temperature equation
julia temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e6 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (
+ ( SymmetricBC (), SymmetricBC ()),
+ ( SymmetricBC (), SymmetricBC ()),
+ ( SymmetricBC (), SymmetricBC ()),
+ ),
+ gdir = 3 ,
+ nondim_type = 1 ,
+)
Setup
julia n = 80
+x = LinRange ( T ( 0 ), T ( 1 ), n + 1 ), LinRange ( T ( 0 ), T ( 1 ), n + 1 ), LinRange ( T ( 0 ), T ( 2 ), 2 n + 1 )
+setup = Setup (;
+ x,
+ boundary_conditions = (
+ ( DirichletBC (), DirichletBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ),
+ Re = 1 / temperature . α1,
+ temperature,
+ backend,
+);
+nothing #hide
This will factorize the Laplace matrix
julia @time psolver = psolver_direct (setup)
Initial conditions
julia ustart = velocityfield (setup, (dim, x, y, z) -> zero (x); psolver);
+tempstart = temperaturefield (setup, (x, y, z) -> ( 1 + sinpi (x / 20 ) * sinpi (y) > z));
+
+fieldplot (
+ (; u = ustart, temp = tempstart, t = T ( 0 ));
+ # state;
+ setup,
+ levels = LinRange{T} ( 0.8 , 1 , 5 ),
+ # levels = LinRange(-T(5), T(1), 10),
+ # fieldname = :eig2field,
+ fieldname = :temperature ,
+ size = ( 400 , 600 ),
+)
Solve equation
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 40 )),
+ Δt = T ( 1e-2 ),
+ psolver,
+ processors = (;
+ # anim = animator(;
+ # path = "$outdir/RT3D.mp4",
+ rtp = realtimeplotter (;
+ setup,
+ nupdate = 20 ,
+ fieldname = :eig2field ,
+ levels = LinRange ( - T ( 5 ), T ( 1 ), 10 ),
+ # fieldname = :temperature,
+ # levels = LinRange{T}(0, 1, 10),
+ size = ( 400 , 600 ),
+ ),
+ # vtk = vtk_writer(;
+ # setup,
+ # nupdate = 10,
+ # dir = outdir,
+ # fieldnames = (:velocity, :pressure, :temperature),
+ # psolver,
+ # ),
+ log = timelogger (; nupdate = 400 ),
+ ),
+);
+nothing #hide
Check distribution of vortex structures for choosing plot levels
julia field = IncompressibleNavierStokes . eig2field (state . u, setup)[setup . grid . Ip]
+hist ( vec ( Array ( log .( max .( eps (T), .- field)))))
Plot temperature field
julia fieldplot (state; setup, fieldname = :temperature )
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
+
+T = Float64
+
+outdir = joinpath ( @__DIR__ , "output" , "RayleighTaylor3D" )
+
+temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e6 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (
+ ( SymmetricBC (), SymmetricBC ()),
+ ( SymmetricBC (), SymmetricBC ()),
+ ( SymmetricBC (), SymmetricBC ()),
+ ),
+ gdir = 3 ,
+ nondim_type = 1 ,
+)
+
+n = 80
+x = LinRange ( T ( 0 ), T ( 1 ), n + 1 ), LinRange ( T ( 0 ), T ( 1 ), n + 1 ), LinRange ( T ( 0 ), T ( 2 ), 2 n + 1 )
+setup = Setup (;
+ x,
+ boundary_conditions = (
+ ( DirichletBC (), DirichletBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ),
+ Re = 1 / temperature . α1,
+ temperature,
+ backend,
+);
+
+@time psolver = psolver_direct (setup)
+
+ustart = velocityfield (setup, (dim, x, y, z) -> zero (x); psolver);
+tempstart = temperaturefield (setup, (x, y, z) -> ( 1 + sinpi (x / 20 ) * sinpi (y) > z));
+
+fieldplot (
+ (; u = ustart, temp = tempstart, t = T ( 0 ));
+ # state;
+ setup,
+ levels = LinRange{T} ( 0.8 , 1 , 5 ),
+ # levels = LinRange(-T(5), T(1), 10),
+ # fieldname = :eig2field,
+ fieldname = :temperature ,
+ size = ( 400 , 600 ),
+)
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 40 )),
+ Δt = T ( 1e-2 ),
+ psolver,
+ processors = (;
+ # anim = animator(;
+ # path = "$outdir/RT3D.mp4",
+ rtp = realtimeplotter (;
+ setup,
+ nupdate = 20 ,
+ fieldname = :eig2field ,
+ levels = LinRange ( - T ( 5 ), T ( 1 ), 10 ),
+ # fieldname = :temperature,
+ # levels = LinRange{T}(0, 1, 10),
+ size = ( 400 , 600 ),
+ ),
+ # vtk = vtk_writer(;
+ # setup,
+ # nupdate = 10,
+ # dir = outdir,
+ # fieldnames = (:velocity, :pressure, :temperature),
+ # psolver,
+ # ),
+ log = timelogger (; nupdate = 400 ),
+ ),
+);
+
+field = IncompressibleNavierStokes . eig2field (state . u, setup)[setup . grid . Ip]
+hist ( vec ( Array ( log .( max .( eps (T), .- field)))))
+
+fieldplot (state; setup, fieldname = :temperature )
This page was generated using Literate.jl .
`,29)]))}const y=i(k,[["render",l]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_RayleighTaylor3D.md.DNAhoUfj.lean.js b/previews/PR126/assets/examples_generated_RayleighTaylor3D.md.DNAhoUfj.lean.js
new file mode 100644
index 00000000..ce56f9c6
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_RayleighTaylor3D.md.DNAhoUfj.lean.js
@@ -0,0 +1,161 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Rayleigh-Taylor instability in 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/RayleighTaylor3D.md","filePath":"examples/generated/RayleighTaylor3D.md","lastUpdated":null}'),k={name:"examples/generated/RayleighTaylor3D.md"};function l(p,s,t,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Rayleigh-Taylor instability in 2D Two fluids with different temperatures start mixing.
julia using CairoMakie
+using IncompressibleNavierStokes
Hardware
julia backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
Precision
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "RayleighTaylor3D" )
Temperature equation
julia temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e6 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (
+ ( SymmetricBC (), SymmetricBC ()),
+ ( SymmetricBC (), SymmetricBC ()),
+ ( SymmetricBC (), SymmetricBC ()),
+ ),
+ gdir = 3 ,
+ nondim_type = 1 ,
+)
Setup
julia n = 80
+x = LinRange ( T ( 0 ), T ( 1 ), n + 1 ), LinRange ( T ( 0 ), T ( 1 ), n + 1 ), LinRange ( T ( 0 ), T ( 2 ), 2 n + 1 )
+setup = Setup (;
+ x,
+ boundary_conditions = (
+ ( DirichletBC (), DirichletBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ),
+ Re = 1 / temperature . α1,
+ temperature,
+ backend,
+);
+nothing #hide
This will factorize the Laplace matrix
julia @time psolver = psolver_direct (setup)
Initial conditions
julia ustart = velocityfield (setup, (dim, x, y, z) -> zero (x); psolver);
+tempstart = temperaturefield (setup, (x, y, z) -> ( 1 + sinpi (x / 20 ) * sinpi (y) > z));
+
+fieldplot (
+ (; u = ustart, temp = tempstart, t = T ( 0 ));
+ # state;
+ setup,
+ levels = LinRange{T} ( 0.8 , 1 , 5 ),
+ # levels = LinRange(-T(5), T(1), 10),
+ # fieldname = :eig2field,
+ fieldname = :temperature ,
+ size = ( 400 , 600 ),
+)
Solve equation
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 40 )),
+ Δt = T ( 1e-2 ),
+ psolver,
+ processors = (;
+ # anim = animator(;
+ # path = "$outdir/RT3D.mp4",
+ rtp = realtimeplotter (;
+ setup,
+ nupdate = 20 ,
+ fieldname = :eig2field ,
+ levels = LinRange ( - T ( 5 ), T ( 1 ), 10 ),
+ # fieldname = :temperature,
+ # levels = LinRange{T}(0, 1, 10),
+ size = ( 400 , 600 ),
+ ),
+ # vtk = vtk_writer(;
+ # setup,
+ # nupdate = 10,
+ # dir = outdir,
+ # fieldnames = (:velocity, :pressure, :temperature),
+ # psolver,
+ # ),
+ log = timelogger (; nupdate = 400 ),
+ ),
+);
+nothing #hide
Check distribution of vortex structures for choosing plot levels
julia field = IncompressibleNavierStokes . eig2field (state . u, setup)[setup . grid . Ip]
+hist ( vec ( Array ( log .( max .( eps (T), .- field)))))
Plot temperature field
julia fieldplot (state; setup, fieldname = :temperature )
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+backend = CPU ()
+
+# using CUDA, CUDSS
+# backend = CUDABackend()
+
+T = Float64
+
+outdir = joinpath ( @__DIR__ , "output" , "RayleighTaylor3D" )
+
+temperature = temperature_equation (;
+ Pr = T ( 0.71 ),
+ Ra = T ( 1e6 ),
+ Ge = T ( 1.0 ),
+ dodissipation = true ,
+ boundary_conditions = (
+ ( SymmetricBC (), SymmetricBC ()),
+ ( SymmetricBC (), SymmetricBC ()),
+ ( SymmetricBC (), SymmetricBC ()),
+ ),
+ gdir = 3 ,
+ nondim_type = 1 ,
+)
+
+n = 80
+x = LinRange ( T ( 0 ), T ( 1 ), n + 1 ), LinRange ( T ( 0 ), T ( 1 ), n + 1 ), LinRange ( T ( 0 ), T ( 2 ), 2 n + 1 )
+setup = Setup (;
+ x,
+ boundary_conditions = (
+ ( DirichletBC (), DirichletBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ),
+ Re = 1 / temperature . α1,
+ temperature,
+ backend,
+);
+
+@time psolver = psolver_direct (setup)
+
+ustart = velocityfield (setup, (dim, x, y, z) -> zero (x); psolver);
+tempstart = temperaturefield (setup, (x, y, z) -> ( 1 + sinpi (x / 20 ) * sinpi (y) > z));
+
+fieldplot (
+ (; u = ustart, temp = tempstart, t = T ( 0 ));
+ # state;
+ setup,
+ levels = LinRange{T} ( 0.8 , 1 , 5 ),
+ # levels = LinRange(-T(5), T(1), 10),
+ # fieldname = :eig2field,
+ fieldname = :temperature ,
+ size = ( 400 , 600 ),
+)
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tempstart,
+ tlims = ( T ( 0 ), T ( 40 )),
+ Δt = T ( 1e-2 ),
+ psolver,
+ processors = (;
+ # anim = animator(;
+ # path = "$outdir/RT3D.mp4",
+ rtp = realtimeplotter (;
+ setup,
+ nupdate = 20 ,
+ fieldname = :eig2field ,
+ levels = LinRange ( - T ( 5 ), T ( 1 ), 10 ),
+ # fieldname = :temperature,
+ # levels = LinRange{T}(0, 1, 10),
+ size = ( 400 , 600 ),
+ ),
+ # vtk = vtk_writer(;
+ # setup,
+ # nupdate = 10,
+ # dir = outdir,
+ # fieldnames = (:velocity, :pressure, :temperature),
+ # psolver,
+ # ),
+ log = timelogger (; nupdate = 400 ),
+ ),
+);
+
+field = IncompressibleNavierStokes . eig2field (state . u, setup)[setup . grid . Ip]
+hist ( vec ( Array ( log .( max .( eps (T), .- field)))))
+
+fieldplot (state; setup, fieldname = :temperature )
This page was generated using Literate.jl .
`,29)]))}const y=i(k,[["render",l]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_ShearLayer2D.md.DGqD8BRv.js b/previews/PR126/assets/examples_generated_ShearLayer2D.md.DGqD8BRv.js
new file mode 100644
index 00000000..5007ce07
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_ShearLayer2D.md.DGqD8BRv.js
@@ -0,0 +1,84 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Shear layer - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/ShearLayer2D.md","filePath":"examples/generated/ShearLayer2D.md","lastUpdated":null}'),t={name:"examples/generated/ShearLayer2D.md"};function p(l,s,k,e,E,d){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Shear layer - 2D Shear layer example.
We start by loading packages. A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "ShearLayer2D" )
Floating point type
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Reynolds number
A 2D grid is a Cartesian product of two vectors
julia n = 128
+lims = T ( 0 ), T ( 2π )
+x = LinRange (lims ... , n + 1 ), LinRange (lims ... , n + 1 )
+plotgrid (x ... )
Build setup and assemble operators
julia setup = Setup (; x, Re, backend);
+nothing #hide
Initial conditions: We add 1 to u in order to make global momentum conservation less trivial
julia d = T ( π / 15 )
+e = T ( 0.05 )
+U1 (y) = y ≤ π ? tanh ((y - T ( π / 2 )) / d) : tanh (( T ( 3π / 2 ) - y) / d)
+# U1(y) = T(1) + (y ≤ π ? tanh((y - T(π / 2)) / d) : tanh((T(3π / 2) - y) / d))
+ustart = velocityfield (setup, (dim, x, y) -> dim == 1 ? U1 (y) : e * sin (x));
+nothing #hide
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 8 )),
+ Δt = T ( 0.01 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Plot pressure
julia fieldplot (state; setup, fieldname = :pressure )
Plot velocity
julia fieldplot (state; setup, fieldname = :velocitynorm )
Plot vorticity
julia fieldplot (state; setup, fieldname = :vorticity )
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "ShearLayer2D" )
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 2000 )
+
+n = 128
+lims = T ( 0 ), T ( 2π )
+x = LinRange (lims ... , n + 1 ), LinRange (lims ... , n + 1 )
+plotgrid (x ... )
+
+setup = Setup (; x, Re, backend);
+
+d = T ( π / 15 )
+e = T ( 0.05 )
+U1 (y) = y ≤ π ? tanh ((y - T ( π / 2 )) / d) : tanh (( T ( 3π / 2 ) - y) / d)
+# U1(y) = T(1) + (y ≤ π ? tanh((y - T(π / 2)) / d) : tanh((T(3π / 2) - y) / d))
+ustart = velocityfield (setup, (dim, x, y) -> dim == 1 ? U1 (y) : e * sin (x));
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 8 )),
+ Δt = T ( 0.01 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+outputs . rtp
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+fieldplot (state; setup, fieldname = :pressure )
+
+fieldplot (state; setup, fieldname = :velocitynorm )
+
+fieldplot (state; setup, fieldname = :vorticity )
This page was generated using Literate.jl .
`,37)]))}const y=i(t,[["render",p]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_ShearLayer2D.md.DGqD8BRv.lean.js b/previews/PR126/assets/examples_generated_ShearLayer2D.md.DGqD8BRv.lean.js
new file mode 100644
index 00000000..5007ce07
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_ShearLayer2D.md.DGqD8BRv.lean.js
@@ -0,0 +1,84 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Shear layer - 2D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/ShearLayer2D.md","filePath":"examples/generated/ShearLayer2D.md","lastUpdated":null}'),t={name:"examples/generated/ShearLayer2D.md"};function p(l,s,k,e,E,d){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Shear layer - 2D Shear layer example.
We start by loading packages. A Makie plotting backend is needed for plotting. GLMakie
creates an interactive window (useful for real-time plotting), but does not work when building this example on GitHub. CairoMakie
makes high-quality static vector-graphics plots.
julia using CairoMakie
+using IncompressibleNavierStokes
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "ShearLayer2D" )
Floating point type
Backend
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Reynolds number
A 2D grid is a Cartesian product of two vectors
julia n = 128
+lims = T ( 0 ), T ( 2π )
+x = LinRange (lims ... , n + 1 ), LinRange (lims ... , n + 1 )
+plotgrid (x ... )
Build setup and assemble operators
julia setup = Setup (; x, Re, backend);
+nothing #hide
Initial conditions: We add 1 to u in order to make global momentum conservation less trivial
julia d = T ( π / 15 )
+e = T ( 0.05 )
+U1 (y) = y ≤ π ? tanh ((y - T ( π / 2 )) / d) : tanh (( T ( 3π / 2 ) - y) / d)
+# U1(y) = T(1) + (y ≤ π ? tanh((y - T(π / 2)) / d) : tanh((T(3π / 2) - y) / d))
+ustart = velocityfield (setup, (dim, x, y) -> dim == 1 ? U1 (y) : e * sin (x));
+nothing #hide
Solve unsteady problem
julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 8 )),
+ Δt = T ( 0.01 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+nothing #hide
Post-process We may visualize or export the computed fields
Export to VTK
julia save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
Plot pressure
julia fieldplot (state; setup, fieldname = :pressure )
Plot velocity
julia fieldplot (state; setup, fieldname = :velocitynorm )
Plot vorticity
julia fieldplot (state; setup, fieldname = :vorticity )
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+outdir = joinpath ( @__DIR__ , "output" , "ShearLayer2D" )
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+Re = T ( 2000 )
+
+n = 128
+lims = T ( 0 ), T ( 2π )
+x = LinRange (lims ... , n + 1 ), LinRange (lims ... , n + 1 )
+plotgrid (x ... )
+
+setup = Setup (; x, Re, backend);
+
+d = T ( π / 15 )
+e = T ( 0.05 )
+U1 (y) = y ≤ π ? tanh ((y - T ( π / 2 )) / d) : tanh (( T ( 3π / 2 ) - y) / d)
+# U1(y) = T(1) + (y ≤ π ? tanh((y - T(π / 2)) / d) : tanh((T(3π / 2) - y) / d))
+ustart = velocityfield (setup, (dim, x, y) -> dim == 1 ? U1 (y) : e * sin (x));
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 8 )),
+ Δt = T ( 0.01 ),
+ processors = (
+ rtp = realtimeplotter (;
+ setup,
+ plot = fieldplot,
+ # plot = energy_history_plot,
+ # plot = energy_spectrum_plot,
+ nupdate = 1 ,
+ ),
+ # anim = animator(; setup, path = "$outdir/vorticity.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ # field = fieldsaver(; setup, nupdate = 10),
+ log = timelogger (; nupdate = 100 ),
+ ),
+);
+
+outputs . rtp
+
+save_vtk (state; setup, filename = joinpath (outdir, "solution" ))
+
+fieldplot (state; setup, fieldname = :pressure )
+
+fieldplot (state; setup, fieldname = :velocitynorm )
+
+fieldplot (state; setup, fieldname = :vorticity )
This page was generated using Literate.jl .
`,37)]))}const y=i(t,[["render",p]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_TaylorGreenVortex2D.md.ByImGK6X.js b/previews/PR126/assets/examples_generated_TaylorGreenVortex2D.md.ByImGK6X.js
new file mode 100644
index 00000000..ea945e28
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_TaylorGreenVortex2D.md.ByImGK6X.js
@@ -0,0 +1,135 @@
+import{_ as l,c as a,j as s,a as h,a5 as t,o as n}from"./chunks/framework.BSoZtefh.js";const p="/IncompressibleNavierStokes.jl/previews/PR126/assets/cssxjov.CGB02zQg.png",m=JSON.parse('{"title":"Convergence study: Taylor-Green vortex (2D)","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/TaylorGreenVortex2D.md","filePath":"examples/generated/TaylorGreenVortex2D.md","lastUpdated":null}'),k={name:"examples/generated/TaylorGreenVortex2D.md"},e={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.474ex"},xmlns:"http://www.w3.org/2000/svg",width:"33.107ex",height:"6.078ex",role:"img",focusable:"false",viewBox:"0 -1593.3 14633.5 2686.7","aria-hidden":"true"};function r(E,i,T,Q,g,y){return n(),a("div",null,[i[2]||(i[2]=s("h1",{id:"Convergence-study:-Taylor-Green-vortex-(2D)",tabindex:"-1"},[h("Convergence study: Taylor-Green vortex (2D) "),s("a",{class:"header-anchor",href:"#Convergence-study:-Taylor-Green-vortex-(2D)","aria-label":'Permalink to "Convergence study: Taylor-Green vortex (2D) {#Convergence-study:-Taylor-Green-vortex-(2D)}"'},"")],-1)),i[3]||(i[3]=s("p",null,"In this example we consider the Taylor-Green vortex. In 2D, it has an analytical solution, given by",-1)),s("mjx-container",e,[(n(),a("svg",d,i[0]||(i[0]=[t(' ',1)]))),i[1]||(i[1]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[s("mtr",null,[s("mtd",null,[s("msup",null,[s("mi",null,"u"),s("mn",null,"1")]),s("mo",{stretchy:"false"},"("),s("mi",null,"x"),s("mo",null,","),s("mi",null,"y"),s("mo",null,","),s("mi",null,"t"),s("mo",{stretchy:"false"},")")]),s("mtd",null,[s("mi"),s("mo",null,"="),s("mo",null,"−"),s("mi",null,"sin"),s("mo",{"data-mjx-texclass":"NONE"},""),s("mo",{stretchy:"false"},"("),s("mi",null,"x"),s("mo",{stretchy:"false"},")"),s("mi",null,"cos"),s("mo",{"data-mjx-texclass":"NONE"},""),s("mo",{stretchy:"false"},"("),s("mi",null,"y"),s("mo",{stretchy:"false"},")"),s("msup",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"e")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",null,"−"),s("mn",null,"2"),s("mi",null,"t"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",null,"/")]),s("mi",null,"R"),s("mi",null,"e")])])])]),s("mtr",null,[s("mtd",null,[s("msup",null,[s("mi",null,"u"),s("mn",null,"2")]),s("mo",{stretchy:"false"},"("),s("mi",null,"x"),s("mo",null,","),s("mi",null,"y"),s("mo",null,","),s("mi",null,"t"),s("mo",{stretchy:"false"},")")]),s("mtd",null,[s("mi"),s("mo",null,"="),s("mo",null,"+"),s("mi",null,"cos"),s("mo",{"data-mjx-texclass":"NONE"},""),s("mo",{stretchy:"false"},"("),s("mi",null,"x"),s("mo",{stretchy:"false"},")"),s("mi",null,"sin"),s("mo",{"data-mjx-texclass":"NONE"},""),s("mo",{stretchy:"false"},"("),s("mi",null,"y"),s("mo",{stretchy:"false"},")"),s("msup",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"e")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",null,"−"),s("mn",null,"2"),s("mi",null,"t"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",null,"/")]),s("mi",null,"R"),s("mi",null,"e")])])])])])])],-1))]),i[4]||(i[4]=t(`This allows us to test the convergence of our solver.
julia using CairoMakie
+using IncompressibleNavierStokes
+using LinearAlgebra
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "TaylorGreenVortex2D" )
+ispath (outdir) || mkpath (outdir)
"/home/runner/work/IncompressibleNavierStokes.jl/IncompressibleNavierStokes.jl/docs/build/examples/generated/output/TaylorGreenVortex2D"
Convergence
julia """
+Compare numerical solution with analytical solution at final time.
+"""
+function compute_convergence (; D, nlist, lims, Re, tlims, Δt, uref, backend = CPU ())
+ T = typeof (lims[ 1 ])
+ e = zeros (T, length (nlist))
+ for (i, n) in enumerate (nlist)
+ @info "Computing error for n = $n "
+ x = ntuple (α -> LinRange (lims ... , n + 1 ), D)
+ setup = Setup (; x, Re, backend)
+ psolver = psolver_spectral (setup)
+ ustart = velocityfield (
+ setup,
+ (dim, x ... ) -> uref (dim, x ... , tlims[ 1 ]),
+ tlims[ 1 ];
+ psolver,
+ )
+ ut = velocityfield (
+ setup,
+ (dim, x ... ) -> uref (dim, x ... , tlims[ 2 ]),
+ tlims[ 2 ];
+ psolver,
+ doproject = false ,
+ )
+ (; u, t), outputs = solve_unsteady (; setup, ustart, tlims, Δt, psolver)
+ (; Ip) = setup . grid
+ a = sum (abs2, u[Ip, :] - ut[Ip, :])
+ b = sum (abs2, ut[Ip, :])
+ e[i] = sqrt (a) / sqrt (b)
+ end
+ e
+end
Analytical solution for 2D Taylor-Green vortex
julia solution (Re) =
+ (dim, x, y, t) -> (dim == 1 ? - sin (x) * cos (y) : cos (x) * sin (y)) * exp ( - 2 t / Re)
solution (generic function with 1 method)
Compute error for different resolutions
julia Re = 2.0e3
+nlist = [ 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 ]
+e = compute_convergence (;
+ D = 2 ,
+ nlist,
+ lims = ( 0.0 , 2π ),
+ Re,
+ tlims = ( 0.0 , 2.0 ),
+ Δt = 0.01 ,
+ uref = solution (Re),
+)
8-element Vector{Float64}:
+ 0.4242656052086717
+ 0.000378932838635171
+ 0.0001007226650833037
+ 2.5570665390686788e-5
+ 6.417292500615618e-6
+ 1.6058662108882434e-6
+ 4.01563057410408e-7
+ 1.003967967340085e-7
Plot convergence
julia fig = Figure ()
+ax = Axis (
+ fig[ 1 , 1 ];
+ xscale = log10,
+ yscale = log10,
+ xticks = nlist,
+ xlabel = "n" ,
+ title = "Relative error" ,
+)
+scatterlines! (ax, nlist, e; label = "Data" )
+lines! (ax, collect ( extrema (nlist)), n -> n ^- 2.0 ; linestyle = :dash , label = "n^-2" )
+axislegend (ax)
+fig
Save figure
julia save ( joinpath (outdir, "convergence.png" ), fig)
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+using LinearAlgebra
+
+outdir = joinpath ( @__DIR__ , "output" , "TaylorGreenVortex2D" )
+ispath (outdir) || mkpath (outdir)
+
+"""
+Compare numerical solution with analytical solution at final time.
+"""
+function compute_convergence (; D, nlist, lims, Re, tlims, Δt, uref, backend = CPU ())
+ T = typeof (lims[ 1 ])
+ e = zeros (T, length (nlist))
+ for (i, n) in enumerate (nlist)
+ @info "Computing error for n = $n "
+ x = ntuple (α -> LinRange (lims ... , n + 1 ), D)
+ setup = Setup (; x, Re, backend)
+ psolver = psolver_spectral (setup)
+ ustart = velocityfield (
+ setup,
+ (dim, x ... ) -> uref (dim, x ... , tlims[ 1 ]),
+ tlims[ 1 ];
+ psolver,
+ )
+ ut = velocityfield (
+ setup,
+ (dim, x ... ) -> uref (dim, x ... , tlims[ 2 ]),
+ tlims[ 2 ];
+ psolver,
+ doproject = false ,
+ )
+ (; u, t), outputs = solve_unsteady (; setup, ustart, tlims, Δt, psolver)
+ (; Ip) = setup . grid
+ a = sum (abs2, u[Ip, :] - ut[Ip, :])
+ b = sum (abs2, ut[Ip, :])
+ e[i] = sqrt (a) / sqrt (b)
+ end
+ e
+end
+
+solution (Re) =
+ (dim, x, y, t) -> (dim == 1 ? - sin (x) * cos (y) : cos (x) * sin (y)) * exp ( - 2 t / Re)
+
+Re = 2.0e3
+nlist = [ 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 ]
+e = compute_convergence (;
+ D = 2 ,
+ nlist,
+ lims = ( 0.0 , 2π ),
+ Re,
+ tlims = ( 0.0 , 2.0 ),
+ Δt = 0.01 ,
+ uref = solution (Re),
+)
+
+fig = Figure ()
+ax = Axis (
+ fig[ 1 , 1 ];
+ xscale = log10,
+ yscale = log10,
+ xticks = nlist,
+ xlabel = "n" ,
+ title = "Relative error" ,
+)
+scatterlines! (ax, nlist, e; label = "Data" )
+lines! (ax, collect ( extrema (nlist)), n -> n ^- 2.0 ; linestyle = :dash , label = "n^-2" )
+axislegend (ax)
+fig
+
+save ( joinpath (outdir, "convergence.png" ), fig)
This page was generated using Literate.jl .
`,25))])}const F=l(k,[["render",r]]);export{m as __pageData,F as default};
diff --git a/previews/PR126/assets/examples_generated_TaylorGreenVortex2D.md.ByImGK6X.lean.js b/previews/PR126/assets/examples_generated_TaylorGreenVortex2D.md.ByImGK6X.lean.js
new file mode 100644
index 00000000..ea945e28
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_TaylorGreenVortex2D.md.ByImGK6X.lean.js
@@ -0,0 +1,135 @@
+import{_ as l,c as a,j as s,a as h,a5 as t,o as n}from"./chunks/framework.BSoZtefh.js";const p="/IncompressibleNavierStokes.jl/previews/PR126/assets/cssxjov.CGB02zQg.png",m=JSON.parse('{"title":"Convergence study: Taylor-Green vortex (2D)","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/TaylorGreenVortex2D.md","filePath":"examples/generated/TaylorGreenVortex2D.md","lastUpdated":null}'),k={name:"examples/generated/TaylorGreenVortex2D.md"},e={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.474ex"},xmlns:"http://www.w3.org/2000/svg",width:"33.107ex",height:"6.078ex",role:"img",focusable:"false",viewBox:"0 -1593.3 14633.5 2686.7","aria-hidden":"true"};function r(E,i,T,Q,g,y){return n(),a("div",null,[i[2]||(i[2]=s("h1",{id:"Convergence-study:-Taylor-Green-vortex-(2D)",tabindex:"-1"},[h("Convergence study: Taylor-Green vortex (2D) "),s("a",{class:"header-anchor",href:"#Convergence-study:-Taylor-Green-vortex-(2D)","aria-label":'Permalink to "Convergence study: Taylor-Green vortex (2D) {#Convergence-study:-Taylor-Green-vortex-(2D)}"'},"")],-1)),i[3]||(i[3]=s("p",null,"In this example we consider the Taylor-Green vortex. In 2D, it has an analytical solution, given by",-1)),s("mjx-container",e,[(n(),a("svg",d,i[0]||(i[0]=[t(' ',1)]))),i[1]||(i[1]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[s("mtr",null,[s("mtd",null,[s("msup",null,[s("mi",null,"u"),s("mn",null,"1")]),s("mo",{stretchy:"false"},"("),s("mi",null,"x"),s("mo",null,","),s("mi",null,"y"),s("mo",null,","),s("mi",null,"t"),s("mo",{stretchy:"false"},")")]),s("mtd",null,[s("mi"),s("mo",null,"="),s("mo",null,"−"),s("mi",null,"sin"),s("mo",{"data-mjx-texclass":"NONE"},""),s("mo",{stretchy:"false"},"("),s("mi",null,"x"),s("mo",{stretchy:"false"},")"),s("mi",null,"cos"),s("mo",{"data-mjx-texclass":"NONE"},""),s("mo",{stretchy:"false"},"("),s("mi",null,"y"),s("mo",{stretchy:"false"},")"),s("msup",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"e")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",null,"−"),s("mn",null,"2"),s("mi",null,"t"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",null,"/")]),s("mi",null,"R"),s("mi",null,"e")])])])]),s("mtr",null,[s("mtd",null,[s("msup",null,[s("mi",null,"u"),s("mn",null,"2")]),s("mo",{stretchy:"false"},"("),s("mi",null,"x"),s("mo",null,","),s("mi",null,"y"),s("mo",null,","),s("mi",null,"t"),s("mo",{stretchy:"false"},")")]),s("mtd",null,[s("mi"),s("mo",null,"="),s("mo",null,"+"),s("mi",null,"cos"),s("mo",{"data-mjx-texclass":"NONE"},""),s("mo",{stretchy:"false"},"("),s("mi",null,"x"),s("mo",{stretchy:"false"},")"),s("mi",null,"sin"),s("mo",{"data-mjx-texclass":"NONE"},""),s("mo",{stretchy:"false"},"("),s("mi",null,"y"),s("mo",{stretchy:"false"},")"),s("msup",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"e")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",null,"−"),s("mn",null,"2"),s("mi",null,"t"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",null,"/")]),s("mi",null,"R"),s("mi",null,"e")])])])])])])],-1))]),i[4]||(i[4]=t(`This allows us to test the convergence of our solver.
julia using CairoMakie
+using IncompressibleNavierStokes
+using LinearAlgebra
Output directory
julia outdir = joinpath ( @__DIR__ , "output" , "TaylorGreenVortex2D" )
+ispath (outdir) || mkpath (outdir)
"/home/runner/work/IncompressibleNavierStokes.jl/IncompressibleNavierStokes.jl/docs/build/examples/generated/output/TaylorGreenVortex2D"
Convergence
julia """
+Compare numerical solution with analytical solution at final time.
+"""
+function compute_convergence (; D, nlist, lims, Re, tlims, Δt, uref, backend = CPU ())
+ T = typeof (lims[ 1 ])
+ e = zeros (T, length (nlist))
+ for (i, n) in enumerate (nlist)
+ @info "Computing error for n = $n "
+ x = ntuple (α -> LinRange (lims ... , n + 1 ), D)
+ setup = Setup (; x, Re, backend)
+ psolver = psolver_spectral (setup)
+ ustart = velocityfield (
+ setup,
+ (dim, x ... ) -> uref (dim, x ... , tlims[ 1 ]),
+ tlims[ 1 ];
+ psolver,
+ )
+ ut = velocityfield (
+ setup,
+ (dim, x ... ) -> uref (dim, x ... , tlims[ 2 ]),
+ tlims[ 2 ];
+ psolver,
+ doproject = false ,
+ )
+ (; u, t), outputs = solve_unsteady (; setup, ustart, tlims, Δt, psolver)
+ (; Ip) = setup . grid
+ a = sum (abs2, u[Ip, :] - ut[Ip, :])
+ b = sum (abs2, ut[Ip, :])
+ e[i] = sqrt (a) / sqrt (b)
+ end
+ e
+end
Analytical solution for 2D Taylor-Green vortex
julia solution (Re) =
+ (dim, x, y, t) -> (dim == 1 ? - sin (x) * cos (y) : cos (x) * sin (y)) * exp ( - 2 t / Re)
solution (generic function with 1 method)
Compute error for different resolutions
julia Re = 2.0e3
+nlist = [ 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 ]
+e = compute_convergence (;
+ D = 2 ,
+ nlist,
+ lims = ( 0.0 , 2π ),
+ Re,
+ tlims = ( 0.0 , 2.0 ),
+ Δt = 0.01 ,
+ uref = solution (Re),
+)
8-element Vector{Float64}:
+ 0.4242656052086717
+ 0.000378932838635171
+ 0.0001007226650833037
+ 2.5570665390686788e-5
+ 6.417292500615618e-6
+ 1.6058662108882434e-6
+ 4.01563057410408e-7
+ 1.003967967340085e-7
Plot convergence
julia fig = Figure ()
+ax = Axis (
+ fig[ 1 , 1 ];
+ xscale = log10,
+ yscale = log10,
+ xticks = nlist,
+ xlabel = "n" ,
+ title = "Relative error" ,
+)
+scatterlines! (ax, nlist, e; label = "Data" )
+lines! (ax, collect ( extrema (nlist)), n -> n ^- 2.0 ; linestyle = :dash , label = "n^-2" )
+axislegend (ax)
+fig
Save figure
julia save ( joinpath (outdir, "convergence.png" ), fig)
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+using LinearAlgebra
+
+outdir = joinpath ( @__DIR__ , "output" , "TaylorGreenVortex2D" )
+ispath (outdir) || mkpath (outdir)
+
+"""
+Compare numerical solution with analytical solution at final time.
+"""
+function compute_convergence (; D, nlist, lims, Re, tlims, Δt, uref, backend = CPU ())
+ T = typeof (lims[ 1 ])
+ e = zeros (T, length (nlist))
+ for (i, n) in enumerate (nlist)
+ @info "Computing error for n = $n "
+ x = ntuple (α -> LinRange (lims ... , n + 1 ), D)
+ setup = Setup (; x, Re, backend)
+ psolver = psolver_spectral (setup)
+ ustart = velocityfield (
+ setup,
+ (dim, x ... ) -> uref (dim, x ... , tlims[ 1 ]),
+ tlims[ 1 ];
+ psolver,
+ )
+ ut = velocityfield (
+ setup,
+ (dim, x ... ) -> uref (dim, x ... , tlims[ 2 ]),
+ tlims[ 2 ];
+ psolver,
+ doproject = false ,
+ )
+ (; u, t), outputs = solve_unsteady (; setup, ustart, tlims, Δt, psolver)
+ (; Ip) = setup . grid
+ a = sum (abs2, u[Ip, :] - ut[Ip, :])
+ b = sum (abs2, ut[Ip, :])
+ e[i] = sqrt (a) / sqrt (b)
+ end
+ e
+end
+
+solution (Re) =
+ (dim, x, y, t) -> (dim == 1 ? - sin (x) * cos (y) : cos (x) * sin (y)) * exp ( - 2 t / Re)
+
+Re = 2.0e3
+nlist = [ 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 ]
+e = compute_convergence (;
+ D = 2 ,
+ nlist,
+ lims = ( 0.0 , 2π ),
+ Re,
+ tlims = ( 0.0 , 2.0 ),
+ Δt = 0.01 ,
+ uref = solution (Re),
+)
+
+fig = Figure ()
+ax = Axis (
+ fig[ 1 , 1 ];
+ xscale = log10,
+ yscale = log10,
+ xticks = nlist,
+ xlabel = "n" ,
+ title = "Relative error" ,
+)
+scatterlines! (ax, nlist, e; label = "Data" )
+lines! (ax, collect ( extrema (nlist)), n -> n ^- 2.0 ; linestyle = :dash , label = "n^-2" )
+axislegend (ax)
+fig
+
+save ( joinpath (outdir, "convergence.png" ), fig)
This page was generated using Literate.jl .
`,25))])}const F=l(k,[["render",r]]);export{m as __pageData,F as default};
diff --git a/previews/PR126/assets/examples_generated_TaylorGreenVortex3D.md.CgnLg1YH.js b/previews/PR126/assets/examples_generated_TaylorGreenVortex3D.md.CgnLg1YH.js
new file mode 100644
index 00000000..8f19a554
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_TaylorGreenVortex3D.md.CgnLg1YH.js
@@ -0,0 +1,82 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Taylor-Green vortex - 3D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/TaylorGreenVortex3D.md","filePath":"examples/generated/TaylorGreenVortex3D.md","lastUpdated":null}'),p={name:"examples/generated/TaylorGreenVortex3D.md"};function l(k,s,t,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Taylor-Green vortex - 3D In this example we consider the Taylor-Green vortex.
julia using CairoMakie
+using IncompressibleNavierStokes
Floating point precision
Backend Running in 3D is heavier than in 2D. If you are running this on a CPU, consider using multiple threads by starting Julia with julia -t auto
, or add "julia.NumThreads": "auto"
to the settings in VSCode.
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Setup julia n = 32
+r = range ( T ( 0 ), T ( 1 ), n + 1 )
+setup = Setup (; x = (r, r, r), Re = T ( 1e3 ), backend);
+psolver = psolver_spectral (setup);
+nothing #hide
Initial conditions
julia U (dim, x, y, z) =
+ if dim == 1
+ sinpi ( 2 x) * cospi ( 2 y) * sinpi ( 2 z) / 2
+ elseif dim == 2
+ - cospi ( 2 x) * sinpi ( 2 y) * sinpi ( 2 z) / 2
+ else
+ zero (x)
+ end
+ustart = velocityfield (setup, U, psolver);
+nothing #hide
Solve unsteady problem julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 1.0 )),
+ Δt = T ( 1e-3 ),
+ processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 10),
+ ehist = realtimeplotter (;
+ setup,
+ plot = energy_history_plot,
+ nupdate = 1 ,
+ displayfig = false ,
+ ),
+ espec = realtimeplotter (; setup, plot = energy_spectrum_plot, nupdate = 10 ),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ log = timelogger (; nupdate = 100 ),
+ ),
+ psolver,
+);
+nothing #hide
Post-process Energy history
Energy spectrum
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+n = 32
+r = range ( T ( 0 ), T ( 1 ), n + 1 )
+setup = Setup (; x = (r, r, r), Re = T ( 1e3 ), backend);
+psolver = psolver_spectral (setup);
+
+U (dim, x, y, z) =
+ if dim == 1
+ sinpi ( 2 x) * cospi ( 2 y) * sinpi ( 2 z) / 2
+ elseif dim == 2
+ - cospi ( 2 x) * sinpi ( 2 y) * sinpi ( 2 z) / 2
+ else
+ zero (x)
+ end
+ustart = velocityfield (setup, U, psolver);
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 1.0 )),
+ Δt = T ( 1e-3 ),
+ processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 10),
+ ehist = realtimeplotter (;
+ setup,
+ plot = energy_history_plot,
+ nupdate = 1 ,
+ displayfig = false ,
+ ),
+ espec = realtimeplotter (; setup, plot = energy_spectrum_plot, nupdate = 10 ),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ log = timelogger (; nupdate = 100 ),
+ ),
+ psolver,
+);
+
+outputs . ehist
+
+outputs . espec
This page was generated using Literate.jl .
`,25)]))}const y=i(p,[["render",l]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_generated_TaylorGreenVortex3D.md.CgnLg1YH.lean.js b/previews/PR126/assets/examples_generated_TaylorGreenVortex3D.md.CgnLg1YH.lean.js
new file mode 100644
index 00000000..8f19a554
--- /dev/null
+++ b/previews/PR126/assets/examples_generated_TaylorGreenVortex3D.md.CgnLg1YH.lean.js
@@ -0,0 +1,82 @@
+import{_ as i,c as a,a5 as n,o as h}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Taylor-Green vortex - 3D","description":"","frontmatter":{},"headers":[],"relativePath":"examples/generated/TaylorGreenVortex3D.md","filePath":"examples/generated/TaylorGreenVortex3D.md","lastUpdated":null}'),p={name:"examples/generated/TaylorGreenVortex3D.md"};function l(k,s,t,e,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`Note: Output is not generated for this example (to save resources on GitHub).
Taylor-Green vortex - 3D In this example we consider the Taylor-Green vortex.
julia using CairoMakie
+using IncompressibleNavierStokes
Floating point precision
Backend Running in 3D is heavier than in 2D. If you are running this on a CPU, consider using multiple threads by starting Julia with julia -t auto
, or add "julia.NumThreads": "auto"
to the settings in VSCode.
julia backend = CPU ()
+# using CUDA; backend = CUDABackend()
Setup julia n = 32
+r = range ( T ( 0 ), T ( 1 ), n + 1 )
+setup = Setup (; x = (r, r, r), Re = T ( 1e3 ), backend);
+psolver = psolver_spectral (setup);
+nothing #hide
Initial conditions
julia U (dim, x, y, z) =
+ if dim == 1
+ sinpi ( 2 x) * cospi ( 2 y) * sinpi ( 2 z) / 2
+ elseif dim == 2
+ - cospi ( 2 x) * sinpi ( 2 y) * sinpi ( 2 z) / 2
+ else
+ zero (x)
+ end
+ustart = velocityfield (setup, U, psolver);
+nothing #hide
Solve unsteady problem julia state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 1.0 )),
+ Δt = T ( 1e-3 ),
+ processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 10),
+ ehist = realtimeplotter (;
+ setup,
+ plot = energy_history_plot,
+ nupdate = 1 ,
+ displayfig = false ,
+ ),
+ espec = realtimeplotter (; setup, plot = energy_spectrum_plot, nupdate = 10 ),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ log = timelogger (; nupdate = 100 ),
+ ),
+ psolver,
+);
+nothing #hide
Post-process Energy history
Energy spectrum
Copy-pasteable code Below is the full code for this example stripped of comments and output.
julia using GLMakie
+using IncompressibleNavierStokes
+
+T = Float64
+
+backend = CPU ()
+# using CUDA; backend = CUDABackend()
+
+n = 32
+r = range ( T ( 0 ), T ( 1 ), n + 1 )
+setup = Setup (; x = (r, r, r), Re = T ( 1e3 ), backend);
+psolver = psolver_spectral (setup);
+
+U (dim, x, y, z) =
+ if dim == 1
+ sinpi ( 2 x) * cospi ( 2 y) * sinpi ( 2 z) / 2
+ elseif dim == 2
+ - cospi ( 2 x) * sinpi ( 2 y) * sinpi ( 2 z) / 2
+ else
+ zero (x)
+ end
+ustart = velocityfield (setup, U, psolver);
+
+state, outputs = solve_unsteady (;
+ setup,
+ ustart,
+ tlims = ( T ( 0 ), T ( 1.0 )),
+ Δt = T ( 1e-3 ),
+ processors = (
+ # rtp = realtimeplotter(; setup, plot = fieldplot, nupdate = 10),
+ ehist = realtimeplotter (;
+ setup,
+ plot = energy_history_plot,
+ nupdate = 1 ,
+ displayfig = false ,
+ ),
+ espec = realtimeplotter (; setup, plot = energy_spectrum_plot, nupdate = 10 ),
+ # anim = animator(; setup, path = "$outdir/solution.mkv", nupdate = 20),
+ # vtk = vtk_writer(; setup, nupdate = 10, dir = outdir, filename = "solution"),
+ log = timelogger (; nupdate = 100 ),
+ ),
+ psolver,
+);
+
+outputs . ehist
+
+outputs . espec
This page was generated using Literate.jl .
`,25)]))}const y=i(p,[["render",l]]);export{g as __pageData,y as default};
diff --git a/previews/PR126/assets/examples_index.md.Bv0KGHOS.js b/previews/PR126/assets/examples_index.md.Bv0KGHOS.js
new file mode 100644
index 00000000..60999c3c
--- /dev/null
+++ b/previews/PR126/assets/examples_index.md.Bv0KGHOS.js
@@ -0,0 +1 @@
+import{d,o as t,c as i,j as e,k as m,g as f,t as p,_ as u,F as y,C as D,b,K as w,a5 as v,G as o,a as c}from"./chunks/framework.BSoZtefh.js";const x={class:"img-box"},_=["href"],k=["src"],N={class:"transparent-box1"},T={class:"caption"},S={class:"transparent-box2"},B={class:"subcaption"},F={class:"opacity-low"},C=d({__name:"GalleryImage",props:{href:{},src:{},caption:{},desc:{}},setup(g){return(a,s)=>(t(),i("div",x,[e("a",{href:a.href},[e("img",{src:m(f)(a.src),height:"100px",alt:""},null,8,k),e("div",N,[e("div",T,[e("h2",null,p(a.caption),1)])]),e("div",S,[e("div",B,[e("p",F,p(a.desc),1)])])],8,_)]))}}),G=u(C,[["__scopeId","data-v-f778be06"]]),P={class:"gallery-image"},R=d({__name:"Gallery",props:{images:{}},setup(g){return(a,s)=>(t(),i("div",P,[(t(!0),i(y,null,D(a.images,l=>(t(),b(G,w({ref_for:!0},l),null,16))),256))]))}}),n=u(R,[["__scopeId","data-v-9f22d17b"]]),A=JSON.parse('{"title":"Examples gallery","description":"","frontmatter":{},"headers":[],"relativePath":"examples/index.md","filePath":"examples/index.md","lastUpdated":null}'),q={name:"examples/index.md"},E=d({...q,setup(g){const a=[{href:"generated/DecayingTurbulence2D",src:"../DecayingTurbulence2D.gif",caption:"Decaying turbulence (2D)",desc:"Decaying turbulence in a periodic 2D-box"},{href:"generated/DecayingTurbulence3D",src:"../DecayingTurbulence3D.png",caption:"Decaying turbulence (3D)",desc:"Decaying turbulence in a periodic 3D-box"},{href:"generated/TaylorGreenVortex2D",src:"../TaylorGreenVortex2D.png",caption:"Taylor-Green vortex (2D)",desc:"Decaying vortex structures in a periodic 2D-box"},{href:"generated/TaylorGreenVortex3D",src:"../TaylorGreenVortex3D.png",caption:"Taylor-Green vortex (3D)",desc:"Decaying vortex structures in a periodic 3D-box"},{href:"generated/Kolmogorov2D",src:"../logo.svg",caption:"Kolmogorov flow (2D)",desc:"Initiate a flow through a sinusoidal force"},{href:"generated/ShearLayer2D",src:"../logo.svg",caption:"Shear-layer (2D)",desc:"Two layers with different velocities"},{href:"generated/PlanarMixing2D",src:"../logo.svg",caption:"Planar mixing (2D)",desc:"Planar mixing layers"}],s=[{href:"generated/Actuator2D",src:"../Actuator2D.gif",caption:"Actuator (2D)",desc:"Unsteady inflow around an actuator disk"},{href:"generated/Actuator3D",src:"../Actuator3D.png",caption:"Actuator (3D)",desc:"Unsteady inflow around an actuator disk"},{href:"generated/BackwardFacingStep2D",src:"../BackwardFacingStep2D.png",caption:"Backward Facing Step (2D)",desc:"Flow past a backward facing step"},{href:"generated/BackwardFacingStep3D",src:"../BackwardFacingStep3D.png",caption:"Backward Facing Step (3D)",desc:"Flow past a backward facing step"},{href:"generated/LidDrivenCavity2D",src:"../logo.svg",caption:"Lid-driven cavity (2D)",desc:"Generate a flow caused by a moving lid"},{href:"generated/LidDrivenCavity3D",src:"../logo.svg",caption:"Lid-driven cavity (3D)",desc:"Generate a flow caused by a moving lid"},{href:"generated/MultiActuator",src:"../logo.svg",desc:"Multi-actuator (2D)",caption:"Unsteady inflow around multiple actuator disks"}],l=[{href:"generated/RayleighBenard2D",src:"../RayleighBenard2D.gif",caption:"Rayleigh-Bénard convection (2D)",desc:"Convection generated by a temperature gradient between a hot and a cold plate"},{href:"generated/RayleighBenard3D",src:"../RayleighBenard3D.gif",caption:"Rayleigh-Bénard convection (3D)",desc:"Convection generated by a temperature gradient between a hot and a cold plate"},{href:"generated/RayleighTaylor2D",src:"../RayleighTaylor2D.gif",caption:"Rayleigh-Taylor instability (2D)",desc:"Convection generated by a temperature gradient between hot and cold fluids"},{href:"generated/RayleighTaylor3D",src:"../logo.svg",caption:"Rayleigh-Taylor instability (3D)",desc:"Convection generated by a temperature gradient between hot and cold fluids"}],h=[{href:"generated/prioranalysis",src:"../logo.svg",caption:"Filter analysis",desc:"Compare discrete filters and their properties with DNS data"},{href:"generated/postanalysis",src:"../logo.svg",caption:"CNN closure models",desc:"Compare CNN closure models for different filters, grid sizes, and projection orders"},{href:"generated/symmetryanalysis",src:"../logo.svg",caption:"Symmetry-preserving closure models",desc:"Train group equivariant CNNs and compare to normal CNNs"}];return(L,r)=>(t(),i("div",null,[r[0]||(r[0]=v('Examples gallery Here is a gallery of selected commented example simulations. The outputs are generated with Literate.jl and displayed inline. Copy-pasteable code is available at the bottom of each example. The raw Julia source scripts can be found in the examples folder.
Simple flows ',3)),o(n,{images:a}),r[1]||(r[1]=e("h2",{id:"Flows-with-mixed-boundary-conditions",tabindex:"-1"},[c("Flows with mixed boundary conditions "),e("a",{class:"header-anchor",href:"#Flows-with-mixed-boundary-conditions","aria-label":'Permalink to "Flows with mixed boundary conditions {#Flows-with-mixed-boundary-conditions}"'},"")],-1)),o(n,{images:s}),r[2]||(r[2]=e("h2",{id:"With-a-temperature-equation",tabindex:"-1"},[c("With a temperature equation "),e("a",{class:"header-anchor",href:"#With-a-temperature-equation","aria-label":'Permalink to "With a temperature equation {#With-a-temperature-equation}"'},"")],-1)),o(n,{images:l}),r[3]||(r[3]=e("h2",{id:"Neural-network-closure-models",tabindex:"-1"},[c("Neural network closure models "),e("a",{class:"header-anchor",href:"#Neural-network-closure-models","aria-label":'Permalink to "Neural network closure models {#Neural-network-closure-models}"'},"")],-1)),o(n,{images:h})]))}});export{A as __pageData,E as default};
diff --git a/previews/PR126/assets/examples_index.md.Bv0KGHOS.lean.js b/previews/PR126/assets/examples_index.md.Bv0KGHOS.lean.js
new file mode 100644
index 00000000..60999c3c
--- /dev/null
+++ b/previews/PR126/assets/examples_index.md.Bv0KGHOS.lean.js
@@ -0,0 +1 @@
+import{d,o as t,c as i,j as e,k as m,g as f,t as p,_ as u,F as y,C as D,b,K as w,a5 as v,G as o,a as c}from"./chunks/framework.BSoZtefh.js";const x={class:"img-box"},_=["href"],k=["src"],N={class:"transparent-box1"},T={class:"caption"},S={class:"transparent-box2"},B={class:"subcaption"},F={class:"opacity-low"},C=d({__name:"GalleryImage",props:{href:{},src:{},caption:{},desc:{}},setup(g){return(a,s)=>(t(),i("div",x,[e("a",{href:a.href},[e("img",{src:m(f)(a.src),height:"100px",alt:""},null,8,k),e("div",N,[e("div",T,[e("h2",null,p(a.caption),1)])]),e("div",S,[e("div",B,[e("p",F,p(a.desc),1)])])],8,_)]))}}),G=u(C,[["__scopeId","data-v-f778be06"]]),P={class:"gallery-image"},R=d({__name:"Gallery",props:{images:{}},setup(g){return(a,s)=>(t(),i("div",P,[(t(!0),i(y,null,D(a.images,l=>(t(),b(G,w({ref_for:!0},l),null,16))),256))]))}}),n=u(R,[["__scopeId","data-v-9f22d17b"]]),A=JSON.parse('{"title":"Examples gallery","description":"","frontmatter":{},"headers":[],"relativePath":"examples/index.md","filePath":"examples/index.md","lastUpdated":null}'),q={name:"examples/index.md"},E=d({...q,setup(g){const a=[{href:"generated/DecayingTurbulence2D",src:"../DecayingTurbulence2D.gif",caption:"Decaying turbulence (2D)",desc:"Decaying turbulence in a periodic 2D-box"},{href:"generated/DecayingTurbulence3D",src:"../DecayingTurbulence3D.png",caption:"Decaying turbulence (3D)",desc:"Decaying turbulence in a periodic 3D-box"},{href:"generated/TaylorGreenVortex2D",src:"../TaylorGreenVortex2D.png",caption:"Taylor-Green vortex (2D)",desc:"Decaying vortex structures in a periodic 2D-box"},{href:"generated/TaylorGreenVortex3D",src:"../TaylorGreenVortex3D.png",caption:"Taylor-Green vortex (3D)",desc:"Decaying vortex structures in a periodic 3D-box"},{href:"generated/Kolmogorov2D",src:"../logo.svg",caption:"Kolmogorov flow (2D)",desc:"Initiate a flow through a sinusoidal force"},{href:"generated/ShearLayer2D",src:"../logo.svg",caption:"Shear-layer (2D)",desc:"Two layers with different velocities"},{href:"generated/PlanarMixing2D",src:"../logo.svg",caption:"Planar mixing (2D)",desc:"Planar mixing layers"}],s=[{href:"generated/Actuator2D",src:"../Actuator2D.gif",caption:"Actuator (2D)",desc:"Unsteady inflow around an actuator disk"},{href:"generated/Actuator3D",src:"../Actuator3D.png",caption:"Actuator (3D)",desc:"Unsteady inflow around an actuator disk"},{href:"generated/BackwardFacingStep2D",src:"../BackwardFacingStep2D.png",caption:"Backward Facing Step (2D)",desc:"Flow past a backward facing step"},{href:"generated/BackwardFacingStep3D",src:"../BackwardFacingStep3D.png",caption:"Backward Facing Step (3D)",desc:"Flow past a backward facing step"},{href:"generated/LidDrivenCavity2D",src:"../logo.svg",caption:"Lid-driven cavity (2D)",desc:"Generate a flow caused by a moving lid"},{href:"generated/LidDrivenCavity3D",src:"../logo.svg",caption:"Lid-driven cavity (3D)",desc:"Generate a flow caused by a moving lid"},{href:"generated/MultiActuator",src:"../logo.svg",desc:"Multi-actuator (2D)",caption:"Unsteady inflow around multiple actuator disks"}],l=[{href:"generated/RayleighBenard2D",src:"../RayleighBenard2D.gif",caption:"Rayleigh-Bénard convection (2D)",desc:"Convection generated by a temperature gradient between a hot and a cold plate"},{href:"generated/RayleighBenard3D",src:"../RayleighBenard3D.gif",caption:"Rayleigh-Bénard convection (3D)",desc:"Convection generated by a temperature gradient between a hot and a cold plate"},{href:"generated/RayleighTaylor2D",src:"../RayleighTaylor2D.gif",caption:"Rayleigh-Taylor instability (2D)",desc:"Convection generated by a temperature gradient between hot and cold fluids"},{href:"generated/RayleighTaylor3D",src:"../logo.svg",caption:"Rayleigh-Taylor instability (3D)",desc:"Convection generated by a temperature gradient between hot and cold fluids"}],h=[{href:"generated/prioranalysis",src:"../logo.svg",caption:"Filter analysis",desc:"Compare discrete filters and their properties with DNS data"},{href:"generated/postanalysis",src:"../logo.svg",caption:"CNN closure models",desc:"Compare CNN closure models for different filters, grid sizes, and projection orders"},{href:"generated/symmetryanalysis",src:"../logo.svg",caption:"Symmetry-preserving closure models",desc:"Train group equivariant CNNs and compare to normal CNNs"}];return(L,r)=>(t(),i("div",null,[r[0]||(r[0]=v('Examples gallery Here is a gallery of selected commented example simulations. The outputs are generated with Literate.jl and displayed inline. Copy-pasteable code is available at the bottom of each example. The raw Julia source scripts can be found in the examples folder.
Simple flows ',3)),o(n,{images:a}),r[1]||(r[1]=e("h2",{id:"Flows-with-mixed-boundary-conditions",tabindex:"-1"},[c("Flows with mixed boundary conditions "),e("a",{class:"header-anchor",href:"#Flows-with-mixed-boundary-conditions","aria-label":'Permalink to "Flows with mixed boundary conditions {#Flows-with-mixed-boundary-conditions}"'},"")],-1)),o(n,{images:s}),r[2]||(r[2]=e("h2",{id:"With-a-temperature-equation",tabindex:"-1"},[c("With a temperature equation "),e("a",{class:"header-anchor",href:"#With-a-temperature-equation","aria-label":'Permalink to "With a temperature equation {#With-a-temperature-equation}"'},"")],-1)),o(n,{images:l}),r[3]||(r[3]=e("h2",{id:"Neural-network-closure-models",tabindex:"-1"},[c("Neural network closure models "),e("a",{class:"header-anchor",href:"#Neural-network-closure-models","aria-label":'Permalink to "Neural network closure models {#Neural-network-closure-models}"'},"")],-1)),o(n,{images:h})]))}});export{A as __pageData,E as default};
diff --git a/previews/PR126/assets/getting_started.md.CNlPkqwq.js b/previews/PR126/assets/getting_started.md.CNlPkqwq.js
new file mode 100644
index 00000000..91bffc35
--- /dev/null
+++ b/previews/PR126/assets/getting_started.md.CNlPkqwq.js
@@ -0,0 +1 @@
+import{_ as t,c as a,a5 as s,o as i}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started.md","filePath":"getting_started.md","lastUpdated":null}'),n={name:"getting_started.md"};function o(r,e,l,d,p,c){return i(),a("div",null,e[0]||(e[0]=[s('Getting Started To install IncompressibleNavierStokes, open up a Julia-REPL, type ]
to get into Pkg-mode, and type:
sh add IncompressibleNavierStokes
which will install the package and all dependencies to your local environment. Note that IncompressibleNavierStokes requires Julia version 1.9
or above.
Check out the gallery for commented example simulations.
',5)]))}const m=t(n,[["render",o]]);export{g as __pageData,m as default};
diff --git a/previews/PR126/assets/getting_started.md.CNlPkqwq.lean.js b/previews/PR126/assets/getting_started.md.CNlPkqwq.lean.js
new file mode 100644
index 00000000..91bffc35
--- /dev/null
+++ b/previews/PR126/assets/getting_started.md.CNlPkqwq.lean.js
@@ -0,0 +1 @@
+import{_ as t,c as a,a5 as s,o as i}from"./chunks/framework.BSoZtefh.js";const g=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started.md","filePath":"getting_started.md","lastUpdated":null}'),n={name:"getting_started.md"};function o(r,e,l,d,p,c){return i(),a("div",null,e[0]||(e[0]=[s('Getting Started To install IncompressibleNavierStokes, open up a Julia-REPL, type ]
to get into Pkg-mode, and type:
sh add IncompressibleNavierStokes
which will install the package and all dependencies to your local environment. Note that IncompressibleNavierStokes requires Julia version 1.9
or above.
Check out the gallery for commented example simulations.
',5)]))}const m=t(n,[["render",o]]);export{g as __pageData,m as default};
diff --git a/previews/PR126/assets/grid.BpiJkA_F.png b/previews/PR126/assets/grid.BpiJkA_F.png
new file mode 100644
index 00000000..a40dbc86
Binary files /dev/null and b/previews/PR126/assets/grid.BpiJkA_F.png differ
diff --git a/previews/PR126/assets/index.md.DfziRIh_.js b/previews/PR126/assets/index.md.DfziRIh_.js
new file mode 100644
index 00000000..5e7502d6
--- /dev/null
+++ b/previews/PR126/assets/index.md.DfziRIh_.js
@@ -0,0 +1 @@
+import{_ as e,c as t,o as a}from"./chunks/framework.BSoZtefh.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Navier-Stokes","text":"Experience 21st century turbulence","tagline":"Differentiable fluid solver written in Julia","image":{"src":"/logo.svg","alt":"IncompressibleNavierStokes"},"actions":[{"theme":"brand","text":"Getting started","link":"/getting_started"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/agdestein/IncompressibleNavierStokes.jl"},{"theme":"alt","text":"Gallery","link":"/examples"}]},"features":[{"icon":" ","title":"GPU acceleration","details":"Fast and efficient 2D/3D kernels for CPU and GPU with CUDA.jl","link":"/manual/gpu"},{"icon":" ","title":"Differentiable physics","details":"Backpropagate through the solver using Zygote.jl to optimize closure models","link":"/manual/differentiability"},{"icon":" ","title":"Neural network integration","details":"Integrate neural network closure models with Lux.jl","link":"/manual/closure"},{"icon":"🌊","title":"Problems","details":"Solve for decaying turbulence, channel flows, actuator disks, Rayleigh-Bénard convection, and more","link":"/examples"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),i={name:"index.md"};function l(n,s,o,r,c,d){return a(),t("div")}const g=e(i,[["render",l]]);export{h as __pageData,g as default};
diff --git a/previews/PR126/assets/index.md.DfziRIh_.lean.js b/previews/PR126/assets/index.md.DfziRIh_.lean.js
new file mode 100644
index 00000000..5e7502d6
--- /dev/null
+++ b/previews/PR126/assets/index.md.DfziRIh_.lean.js
@@ -0,0 +1 @@
+import{_ as e,c as t,o as a}from"./chunks/framework.BSoZtefh.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Navier-Stokes","text":"Experience 21st century turbulence","tagline":"Differentiable fluid solver written in Julia","image":{"src":"/logo.svg","alt":"IncompressibleNavierStokes"},"actions":[{"theme":"brand","text":"Getting started","link":"/getting_started"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/agdestein/IncompressibleNavierStokes.jl"},{"theme":"alt","text":"Gallery","link":"/examples"}]},"features":[{"icon":" ","title":"GPU acceleration","details":"Fast and efficient 2D/3D kernels for CPU and GPU with CUDA.jl","link":"/manual/gpu"},{"icon":" ","title":"Differentiable physics","details":"Backpropagate through the solver using Zygote.jl to optimize closure models","link":"/manual/differentiability"},{"icon":" ","title":"Neural network integration","details":"Integrate neural network closure models with Lux.jl","link":"/manual/closure"},{"icon":"🌊","title":"Problems","details":"Solve for decaying turbulence, channel flows, actuator disks, Rayleigh-Bénard convection, and more","link":"/examples"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),i={name:"index.md"};function l(n,s,o,r,c,d){return a(),t("div")}const g=e(i,[["render",l]]);export{h as __pageData,g as default};
diff --git a/previews/PR126/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/previews/PR126/assets/inter-italic-cyrillic-ext.r48I6akx.woff2
new file mode 100644
index 00000000..b6b603d5
Binary files /dev/null and b/previews/PR126/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 differ
diff --git a/previews/PR126/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/previews/PR126/assets/inter-italic-cyrillic.By2_1cv3.woff2
new file mode 100644
index 00000000..def40a4f
Binary files /dev/null and b/previews/PR126/assets/inter-italic-cyrillic.By2_1cv3.woff2 differ
diff --git a/previews/PR126/assets/inter-italic-greek-ext.1u6EdAuj.woff2 b/previews/PR126/assets/inter-italic-greek-ext.1u6EdAuj.woff2
new file mode 100644
index 00000000..e070c3d3
Binary files /dev/null and b/previews/PR126/assets/inter-italic-greek-ext.1u6EdAuj.woff2 differ
diff --git a/previews/PR126/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/previews/PR126/assets/inter-italic-greek.DJ8dCoTZ.woff2
new file mode 100644
index 00000000..a3c16ca4
Binary files /dev/null and b/previews/PR126/assets/inter-italic-greek.DJ8dCoTZ.woff2 differ
diff --git a/previews/PR126/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/previews/PR126/assets/inter-italic-latin-ext.CN1xVJS-.woff2
new file mode 100644
index 00000000..2210a899
Binary files /dev/null and b/previews/PR126/assets/inter-italic-latin-ext.CN1xVJS-.woff2 differ
diff --git a/previews/PR126/assets/inter-italic-latin.C2AdPX0b.woff2 b/previews/PR126/assets/inter-italic-latin.C2AdPX0b.woff2
new file mode 100644
index 00000000..790d62dc
Binary files /dev/null and b/previews/PR126/assets/inter-italic-latin.C2AdPX0b.woff2 differ
diff --git a/previews/PR126/assets/inter-italic-vietnamese.BSbpV94h.woff2 b/previews/PR126/assets/inter-italic-vietnamese.BSbpV94h.woff2
new file mode 100644
index 00000000..1eec0775
Binary files /dev/null and b/previews/PR126/assets/inter-italic-vietnamese.BSbpV94h.woff2 differ
diff --git a/previews/PR126/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 b/previews/PR126/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2
new file mode 100644
index 00000000..2cfe6153
Binary files /dev/null and b/previews/PR126/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 differ
diff --git a/previews/PR126/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 b/previews/PR126/assets/inter-roman-cyrillic.C5lxZ8CY.woff2
new file mode 100644
index 00000000..e3886dd1
Binary files /dev/null and b/previews/PR126/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 differ
diff --git a/previews/PR126/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/previews/PR126/assets/inter-roman-greek-ext.CqjqNYQ-.woff2
new file mode 100644
index 00000000..36d67487
Binary files /dev/null and b/previews/PR126/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 differ
diff --git a/previews/PR126/assets/inter-roman-greek.BBVDIX6e.woff2 b/previews/PR126/assets/inter-roman-greek.BBVDIX6e.woff2
new file mode 100644
index 00000000..2bed1e85
Binary files /dev/null and b/previews/PR126/assets/inter-roman-greek.BBVDIX6e.woff2 differ
diff --git a/previews/PR126/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/previews/PR126/assets/inter-roman-latin-ext.4ZJIpNVo.woff2
new file mode 100644
index 00000000..9a8d1e2b
Binary files /dev/null and b/previews/PR126/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 differ
diff --git a/previews/PR126/assets/inter-roman-latin.Di8DUHzh.woff2 b/previews/PR126/assets/inter-roman-latin.Di8DUHzh.woff2
new file mode 100644
index 00000000..07d3c53a
Binary files /dev/null and b/previews/PR126/assets/inter-roman-latin.Di8DUHzh.woff2 differ
diff --git a/previews/PR126/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/previews/PR126/assets/inter-roman-vietnamese.BjW4sHH5.woff2
new file mode 100644
index 00000000..57bdc22a
Binary files /dev/null and b/previews/PR126/assets/inter-roman-vietnamese.BjW4sHH5.woff2 differ
diff --git a/previews/PR126/assets/izkcxez.BjVPut0E.png b/previews/PR126/assets/izkcxez.BjVPut0E.png
new file mode 100644
index 00000000..fb383b9d
Binary files /dev/null and b/previews/PR126/assets/izkcxez.BjVPut0E.png differ
diff --git a/previews/PR126/assets/jqxyinv.D8geYuhY.png b/previews/PR126/assets/jqxyinv.D8geYuhY.png
new file mode 100644
index 00000000..3445d4e7
Binary files /dev/null and b/previews/PR126/assets/jqxyinv.D8geYuhY.png differ
diff --git a/previews/PR126/assets/kktjebp.C2NI-x6W.png b/previews/PR126/assets/kktjebp.C2NI-x6W.png
new file mode 100644
index 00000000..179e9cf4
Binary files /dev/null and b/previews/PR126/assets/kktjebp.C2NI-x6W.png differ
diff --git a/previews/PR126/assets/ksyekmh.BQ4kmQL6.png b/previews/PR126/assets/ksyekmh.BQ4kmQL6.png
new file mode 100644
index 00000000..ade99853
Binary files /dev/null and b/previews/PR126/assets/ksyekmh.BQ4kmQL6.png differ
diff --git a/previews/PR126/assets/manual_closure.md.DJlmWyys.js b/previews/PR126/assets/manual_closure.md.DJlmWyys.js
new file mode 100644
index 00000000..975ca61c
--- /dev/null
+++ b/previews/PR126/assets/manual_closure.md.DJlmWyys.js
@@ -0,0 +1,112 @@
+import{_ as r,c as n,a5 as a,j as t,a as s,G as i,B as d,o}from"./chunks/framework.BSoZtefh.js";const I1=JSON.parse('{"title":"Neural closure models","description":"","frontmatter":{},"headers":[],"relativePath":"manual/closure.md","filePath":"manual/closure.md","lastUpdated":null}'),T={name:"manual/closure.md"},p={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},Q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.243ex"},xmlns:"http://www.w3.org/2000/svg",width:"17.749ex",height:"7.618ex",role:"img",focusable:"false",viewBox:"0 -1933.5 7845 3367","aria-hidden":"true"},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.633ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 722 683","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.239ex",height:"1.753ex",role:"img",focusable:"false",viewBox:"0 -693 3199.6 775","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.243ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.494ex",height:"7.618ex",role:"img",focusable:"false",viewBox:"0 -1933.5 9500.4 3367","aria-hidden":"true"},b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"2.378ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 1051 683","aria-hidden":"true"},x={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.695ex",height:"1.538ex",role:"img",focusable:"false",viewBox:"0 -680 749 680","aria-hidden":"true"},f={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.778ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 786 727","aria-hidden":"true"},v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},H={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.26ex",height:"2.98ex",role:"img",focusable:"false",viewBox:"0 -1067 7187 1317","aria-hidden":"true"},j={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"2.378ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 1051 683","aria-hidden":"true"},M={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},L={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.633ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 722 683","aria-hidden":"true"},V={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.98ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 433 453","aria-hidden":"true"},Z={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.105ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4908.2 1000","aria-hidden":"true"},F={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.408ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2390.6 705","aria-hidden":"true"},O={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},S={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.243ex"},xmlns:"http://www.w3.org/2000/svg",width:"26.935ex",height:"7.618ex",role:"img",focusable:"false",viewBox:"0 -1933.5 11905.1 3367","aria-hidden":"true"},B={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},W={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},$={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.593ex",role:"img",focusable:"false",viewBox:"0 -693 572 704","aria-hidden":"true"},K={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.98ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 433 453","aria-hidden":"true"},_={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},t1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.687ex",height:"2.57ex",role:"img",focusable:"false",viewBox:"0 -886.1 11353.9 1136.1","aria-hidden":"true"},e1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},s1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.483ex",height:"2.565ex",role:"img",focusable:"false",viewBox:"0 -883.9 9053.6 1133.9","aria-hidden":"true"},a1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.355ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.035ex",height:"1.926ex",role:"img",focusable:"false",viewBox:"0 -694 899.6 851.1","aria-hidden":"true"},i1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},n1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.023ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.061ex",height:"1.618ex",role:"img",focusable:"false",viewBox:"0 -705 469 715","aria-hidden":"true"},o1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"5.117ex",height:"1.892ex",role:"img",focusable:"false",viewBox:"0 -836.1 2261.7 836.1","aria-hidden":"true"},d1={class:"jldocstring custom-block",open:""},T1={class:"jldocstring custom-block",open:""},p1={class:"jldocstring custom-block",open:""},Q1={class:"jldocstring custom-block",open:""},m1={class:"jldocstring custom-block",open:""},h1={class:"jldocstring custom-block",open:""},u1={class:"jldocstring custom-block",open:""},c1={class:"jldocstring custom-block",open:""},g1={class:"jldocstring custom-block",open:""},k1={class:"jldocstring custom-block",open:""},b1={class:"jldocstring custom-block",open:""},y1={class:"jldocstring custom-block",open:""},x1={class:"jldocstring custom-block",open:""},E1={class:"jldocstring custom-block",open:""},f1={class:"jldocstring custom-block",open:""},w1={class:"jldocstring custom-block",open:""},v1={class:"jldocstring custom-block",open:""},H1={class:"jldocstring custom-block",open:""},j1={class:"jldocstring custom-block",open:""},C1={class:"jldocstring custom-block",open:""},M1={class:"jldocstring custom-block",open:""},L1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},V1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.04ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2227.7 1000","aria-hidden":"true"},N1={class:"jldocstring custom-block",open:""},Z1={class:"jldocstring custom-block",open:""};function D1(F1,e,A1,O1,S1,B1){const l=d("Badge");return o(),n("div",null,[e[166]||(e[166]=a(`Neural closure models NeuralClosure
These features are experimental, and require cloning IncompressibleNavierStokes from GitHub:
sh git clone https://github.com/agdestein/IncompressibleNavierStokes.jl
+cd IncompressibleNavierStokes/lib/NeuralClosure
Large eddy simulation, a closure model is required. With IncompressibleNavierStokes, a neural closure model can be trained on filtered DNS data. The discrete DNS equations are given by
`,3)),t("mjx-container",p,[(o(),n("svg",Q,e[0]||(e[0]=[a(' ',1)]))),e[1]||(e[1]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mi",null,"M"),t("mi",null,"u")]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mn",null,"0"),t("mo",null,",")])]),t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"u")]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mi",null,"u"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("mi",null,"G"),t("mi",null,"p"),t("mo",null,".")])])])])],-1))]),t("p",null,[e[6]||(e[6]=s("Applying a spatial filter ")),t("mjx-container",m,[(o(),n("svg",h,e[2]||(e[2]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"3A6",d:"M312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415Z",style:{"stroke-width":"3"}})])])],-1)]))),e[3]||(e[3]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Φ")])],-1))]),e[7]||(e[7]=s(", the extracted large scale components ")),t("mjx-container",u,[(o(),n("svg",c,e[4]||(e[4]=[a(' ',1)]))),e[5]||(e[5]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,"="),t("mi",{mathvariant:"normal"},"Φ"),t("mi",null,"u")])],-1))]),e[8]||(e[8]=s(" are governed by the equation"))]),t("mjx-container",g,[(o(),n("svg",k,e[9]||(e[9]=[a(' ',1)]))),e[10]||(e[10]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mi",null,"M"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mn",null,"0"),t("mo",null,",")])]),t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])])]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mi",null,"c"),t("mo",null,"−"),t("mi",null,"G"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"p"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,",")])])])])],-1))]),t("p",null,[e[29]||(e[29]=s("where the discretizations ")),t("mjx-container",b,[(o(),n("svg",y,e[11]||(e[11]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D440",d:"M289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629Z",style:{"stroke-width":"3"}})])])],-1)]))),e[12]||(e[12]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"M")])],-1))]),e[30]||(e[30]=s(", ")),t("mjx-container",x,[(o(),n("svg",E,e[13]||(e[13]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D439",d:"M48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1Z",style:{"stroke-width":"3"}})])])],-1)]))),e[14]||(e[14]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"F")])],-1))]),e[31]||(e[31]=s(", and ")),t("mjx-container",f,[(o(),n("svg",w,e[15]||(e[15]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D43A",d:"M50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q492 659 471 656T418 643T357 615T294 567T236 496T189 394T158 260Q156 242 156 221Q156 173 170 136T206 79T256 45T308 28T353 24Q407 24 452 47T514 106Q517 114 529 161T541 214Q541 222 528 224T468 227H431Q425 233 425 235T427 254Q431 267 437 273H454Q494 271 594 271Q634 271 659 271T695 272T707 272Q721 272 721 263Q721 261 719 249Q714 230 709 228Q706 227 694 227Q674 227 653 224Q646 221 643 215T629 164Q620 131 614 108Q589 6 586 3Q584 1 581 1Q571 1 553 21T530 52Q530 53 528 52T522 47Q448 -22 322 -22Q201 -22 126 55T50 252Z",style:{"stroke-width":"3"}})])])],-1)]))),e[16]||(e[16]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"G")])],-1))]),e[32]||(e[32]=s(" are adapted to the size of their inputs and ")),t("mjx-container",v,[(o(),n("svg",H,e[17]||(e[17]=[a(' ',1)]))),e[18]||(e[18]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"c"),t("mo",null,"="),t("mover",null,[t("mrow",null,[t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mi",null,"u"),t("mo",{stretchy:"false"},")")]),t("mo",{accent:"true"},"―")]),t("mo",null,"−"),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("mo",{stretchy:"false"},")")])],-1))]),e[33]||(e[33]=s(" is a commutator error. We here assumed that ")),t("mjx-container",j,[(o(),n("svg",C,e[19]||(e[19]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D440",d:"M289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629Z",style:{"stroke-width":"3"}})])])],-1)]))),e[20]||(e[20]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"M")])],-1))]),e[34]||(e[34]=s(" and ")),t("mjx-container",M,[(o(),n("svg",L,e[21]||(e[21]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"3A6",d:"M312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415Z",style:{"stroke-width":"3"}})])])],-1)]))),e[22]||(e[22]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Φ")])],-1))]),e[35]||(e[35]=s(" commute, which is the case for face averaging filters. Replacing ")),t("mjx-container",V,[(o(),n("svg",N,e[23]||(e[23]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D450",d:"M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z",style:{"stroke-width":"3"}})])])],-1)]))),e[24]||(e[24]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"c")])],-1))]),e[36]||(e[36]=s(" with a parameterized closure model ")),t("mjx-container",Z,[(o(),n("svg",D,e[25]||(e[25]=[a(' ',1)]))),e[26]||(e[26]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"m"),t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,","),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mo",null,"≈"),t("mi",null,"c")])],-1))]),e[37]||(e[37]=s(" gives the LES equations for the approximate large scale velocity ")),t("mjx-container",F,[(o(),n("svg",A,e[27]||(e[27]=[a(' ',1)]))),e[28]||(e[28]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,"≈"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])])])],-1))])]),t("mjx-container",O,[(o(),n("svg",S,e[38]||(e[38]=[a(' ',1)]))),e[39]||(e[39]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mi",null,"M"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mn",null,"0"),t("mo",null,",")])]),t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])])]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mi",null,"m"),t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,","),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("mi",null,"G"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"q"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,".")])])])])],-1))]),e[167]||(e[167]=t("h2",{id:"NeuralClosure-module",tabindex:"-1"},[s("NeuralClosure module "),t("a",{class:"header-anchor",href:"#NeuralClosure-module","aria-label":'Permalink to "NeuralClosure module {#NeuralClosure-module}"'},"")],-1)),e[168]||(e[168]=t("p",null,"IncompressibleNavierStokes provides a NeuralClosure module.",-1)),t("details",B,[t("summary",null,[e[40]||(e[40]=t("a",{id:"NeuralClosure.NeuralClosure",href:"#NeuralClosure.NeuralClosure"},[t("span",{class:"jlbinding"},"NeuralClosure.NeuralClosure")],-1)),e[41]||(e[41]=s()),i(l,{type:"info",class:"jlObjectType jlModule",text:"Module"})]),e[42]||(e[42]=t("p",null,"Neural closure modelling tools.",-1)),e[43]||(e[43]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/lib/NeuralClosure/src/NeuralClosure.jl#L1-L3",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",R,[t("summary",null,[e[44]||(e[44]=t("a",{id:"NeuralClosure.collocate-Tuple{Any}",href:"#NeuralClosure.collocate-Tuple{Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.collocate")],-1)),e[45]||(e[45]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[46]||(e[46]=a('Interpolate velocity components to volume centers.
source
',3))]),t("details",I,[t("summary",null,[e[47]||(e[47]=t("a",{id:"NeuralClosure.create_closure-Tuple",href:"#NeuralClosure.create_closure-Tuple"},[t("span",{class:"jlbinding"},"NeuralClosure.create_closure")],-1)),e[48]||(e[48]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[49]||(e[49]=a('julia create_closure (layers ... ; rng)
Create neural closure model from layers.
source
',3))]),t("details",z,[t("summary",null,[e[50]||(e[50]=t("a",{id:"NeuralClosure.decollocate-Tuple{Any}",href:"#NeuralClosure.decollocate-Tuple{Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.decollocate")],-1)),e[51]||(e[51]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[52]||(e[52]=a('julia decollocate (u) -> Any
Interpolate closure force from volume centers to volume faces.
source
',3))]),t("details",G,[t("summary",null,[e[53]||(e[53]=t("a",{id:"NeuralClosure.wrappedclosure-Tuple{Any, Any}",href:"#NeuralClosure.wrappedclosure-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.wrappedclosure")],-1)),e[54]||(e[54]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[55]||(e[55]=a(`julia wrappedclosure (
+ m,
+ setup
+) -> NeuralClosure . var"#neuralclosure#1"
Wrap closure model and parameters so that it can be used in the solver.
source
`,3))]),e[169]||(e[169]=t("h2",{id:"filters",tabindex:"-1"},[s("Filters "),t("a",{class:"header-anchor",href:"#filters","aria-label":'Permalink to "Filters"'},"")],-1)),e[170]||(e[170]=t("p",null,"The following filters are available:",-1)),t("details",q,[t("summary",null,[e[56]||(e[56]=t("a",{id:"NeuralClosure.AbstractFilter",href:"#NeuralClosure.AbstractFilter"},[t("span",{class:"jlbinding"},"NeuralClosure.AbstractFilter")],-1)),e[57]||(e[57]=s()),i(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),e[58]||(e[58]=a('julia abstract type AbstractFilter
Discrete DNS filter.
Subtypes ConcreteFilter
should implement the in-place method:
(::ConcreteFilter)(v, u, setup_les, compression)
which filters the DNS field u
and put result in LES field v
. Then the out-of place method:
(::ConcreteFilter)(u, setup_les, compression)
automatically becomes available.
Fields
source
',9))]),t("details",X,[t("summary",null,[e[59]||(e[59]=t("a",{id:"NeuralClosure.FaceAverage",href:"#NeuralClosure.FaceAverage"},[t("span",{class:"jlbinding"},"NeuralClosure.FaceAverage")],-1)),e[60]||(e[60]=s()),i(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),e[61]||(e[61]=a('julia struct FaceAverage <: NeuralClosure.AbstractFilter
Average fine grid velocity field over coarse volume face.
Fields
source
',4))]),t("details",J,[t("summary",null,[e[62]||(e[62]=t("a",{id:"NeuralClosure.VolumeAverage",href:"#NeuralClosure.VolumeAverage"},[t("span",{class:"jlbinding"},"NeuralClosure.VolumeAverage")],-1)),e[63]||(e[63]=s()),i(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),e[64]||(e[64]=a('julia struct VolumeAverage <: NeuralClosure.AbstractFilter
Average fine grid velocity field over coarse volume.
Fields
source
',4))]),t("details",P,[t("summary",null,[e[65]||(e[65]=t("a",{id:"NeuralClosure.reconstruct!-NTuple{5, Any}",href:"#NeuralClosure.reconstruct!-NTuple{5, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.reconstruct!")],-1)),e[66]||(e[66]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[67]||(e[67]=a('julia reconstruct! (u, v, setup_dns, setup_les, comp) -> Any
Reconstruct DNS velocity u
from LES velocity v
.
source
',3))]),t("details",U,[t("summary",null,[e[68]||(e[68]=t("a",{id:"NeuralClosure.reconstruct-NTuple{4, Any}",href:"#NeuralClosure.reconstruct-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.reconstruct")],-1)),e[69]||(e[69]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[70]||(e[70]=a('julia reconstruct (v, setup_dns, setup_les, comp) -> Any
Reconstruct DNS velocity field. See also reconstruct!
.
source
',3))]),e[171]||(e[171]=t("h2",{id:"training",tabindex:"-1"},[s("Training "),t("a",{class:"header-anchor",href:"#training","aria-label":'Permalink to "Training"'},"")],-1)),t("p",null,[e[75]||(e[75]=s("To improve the model parameters, we exploit exact filtered DNS data ")),t("mjx-container",W,[(o(),n("svg",$,e[71]||(e[71]=[a(' ',1)]))),e[72]||(e[72]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])])])],-1))]),e[76]||(e[76]=s(" and exact commutator errors ")),t("mjx-container",K,[(o(),n("svg",Y,e[73]||(e[73]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D450",d:"M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z",style:{"stroke-width":"3"}})])])],-1)]))),e[74]||(e[74]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"c")])],-1))]),e[77]||(e[77]=s(" obtained through DNS. The model is trained by minimizing the a priori loss function"))]),t("mjx-container",_,[(o(),n("svg",t1,e[78]||(e[78]=[a(' ',1)]))),e[79]||(e[79]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msup",null,[t("mi",null,"L"),t("mtext",null,"prior")]),t("mo",{stretchy:"false"},"("),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mo",null,"="),t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mi",null,"m"),t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,","),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("mi",null,"c"),t("msup",null,[t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mn",null,"2")]),t("mo",null,",")])],-1))]),e[172]||(e[172]=t("p",null,"or the a posteriori loss function",-1)),t("mjx-container",e1,[(o(),n("svg",s1,e[80]||(e[80]=[a(' ',1)]))),e[81]||(e[81]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msup",null,[t("mi",null,"L"),t("mtext",null,"post")]),t("mo",{stretchy:"false"},"("),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mo",null,"="),t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("msub",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])]),t("mi",null,"θ")]),t("mo",null,"−"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("msup",null,[t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mn",null,"2")]),t("mo",null,",")])],-1))]),t("p",null,[e[88]||(e[88]=s("where ")),t("mjx-container",a1,[(o(),n("svg",l1,e[82]||(e[82]=[a(' ',1)]))),e[83]||(e[83]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])]),t("mi",null,"θ")])])],-1))]),e[89]||(e[89]=s(" is the solution to the LES equation for the given parameters ")),t("mjx-container",i1,[(o(),n("svg",n1,e[84]||(e[84]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D703",d:"M35 200Q35 302 74 415T180 610T319 704Q320 704 327 704T339 705Q393 701 423 656Q462 596 462 495Q462 380 417 261T302 66T168 -10H161Q125 -10 99 10T60 63T41 130T35 200ZM383 566Q383 668 330 668Q294 668 260 623T204 521T170 421T157 371Q206 370 254 370L351 371Q352 372 359 404T375 484T383 566ZM113 132Q113 26 166 26Q181 26 198 36T239 74T287 161T335 307L340 324H145Q145 321 136 286T120 208T113 132Z",style:{"stroke-width":"3"}})])])],-1)]))),e[85]||(e[85]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"θ")])],-1))]),e[90]||(e[90]=s(". The prior loss is easy to evaluate and easy to differentiate, as it does not involve solving the ODE. However, minimizing ")),t("mjx-container",o1,[(o(),n("svg",r1,e[86]||(e[86]=[a(' ',1)]))),e[87]||(e[87]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"L"),t("mtext",null,"prior")])])],-1))]),e[91]||(e[91]=s(" does not take into account the effect of the prediction error on the LES solution error. The posterior loss does, but has a longer computational chain involving solving the LES ODE."))]),t("details",d1,[t("summary",null,[e[92]||(e[92]=t("a",{id:"NeuralClosure.create_callback-Tuple{Any}",href:"#NeuralClosure.create_callback-Tuple{Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_callback")],-1)),e[93]||(e[93]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[94]||(e[94]=a(`julia create_callback (
+ err;
+ θ,
+ callbackstate,
+ displayref,
+ displayfig,
+ displayupdates,
+ figfile,
+ nupdate
+)
Create convergence plot for relative error between f(x, θ)
and y
. At each callback, plot is updated and current error is printed.
If state
is nonempty, it also plots previous convergence.
If not using interactive GLMakie window, set displayupdates
to true
.
source
`,5))]),t("details",T1,[t("summary",null,[e[95]||(e[95]=t("a",{id:"NeuralClosure.create_dataloader_post-Tuple{Any}",href:"#NeuralClosure.create_dataloader_post-Tuple{Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_dataloader_post")],-1)),e[96]||(e[96]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[97]||(e[97]=a(`julia create_dataloader_post (
+ trajectories;
+ ntrajectory,
+ nunroll,
+ device
+)
Create trajectory dataloader.
source
`,3))]),t("details",p1,[t("summary",null,[e[98]||(e[98]=t("a",{id:"NeuralClosure.create_dataloader_prior-Tuple{Any}",href:"#NeuralClosure.create_dataloader_prior-Tuple{Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_dataloader_prior")],-1)),e[99]||(e[99]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[100]||(e[100]=a(`julia create_dataloader_prior (
+ data;
+ batchsize,
+ device
+) -> NeuralClosure . var"#dataloader#40" {Int64}
Create dataloader that uses a batch of batchsize
random samples from data
at each evaluation. The batch is moved to device
.
source
`,3))]),t("details",Q1,[t("summary",null,[e[101]||(e[101]=t("a",{id:"NeuralClosure.create_loss_post-Tuple{}",href:"#NeuralClosure.create_loss_post-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_loss_post")],-1)),e[102]||(e[102]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[103]||(e[103]=a(`julia create_loss_post (
+;
+ setup,
+ method,
+ psolver,
+ closure_model,
+ nsubstep
+)
Create a-posteriori loss function.
source
`,3))]),t("details",m1,[t("summary",null,[e[104]||(e[104]=t("a",{id:"NeuralClosure.create_loss_prior",href:"#NeuralClosure.create_loss_prior"},[t("span",{class:"jlbinding"},"NeuralClosure.create_loss_prior")],-1)),e[105]||(e[105]=s()),i(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[106]||(e[106]=a(`julia create_loss_prior (
+ f
+) -> NeuralClosure . var"#loss_prior#53" {_A, NeuralClosure . var"#51#52" } where _A
+create_loss_prior (
+ f,
+ normalize
+) -> NeuralClosure . var"#loss_prior#53"
Return mean squared error loss for the predictor f
.
source
`,3))]),t("details",h1,[t("summary",null,[e[107]||(e[107]=t("a",{id:"NeuralClosure.create_relerr_post-Tuple{}",href:"#NeuralClosure.create_relerr_post-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_relerr_post")],-1)),e[108]||(e[108]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[109]||(e[109]=a(`julia create_relerr_post (
+;
+ data,
+ setup,
+ method,
+ psolver,
+ closure_model,
+ nsubstep
+)
Create a-posteriori relative error.
source
`,3))]),t("details",u1,[t("summary",null,[e[110]||(e[110]=t("a",{id:"NeuralClosure.create_relerr_prior-Tuple{Any, Any, Any}",href:"#NeuralClosure.create_relerr_prior-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_relerr_prior")],-1)),e[111]||(e[111]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[112]||(e[112]=a('julia create_relerr_prior (f, x, y) -> NeuralClosure . var"#54#55"
Create a-priori error.
source
',3))]),t("details",c1,[t("summary",null,[e[113]||(e[113]=t("a",{id:"NeuralClosure.create_relerr_symmetry_post-Tuple{}",href:"#NeuralClosure.create_relerr_symmetry_post-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_relerr_symmetry_post")],-1)),e[114]||(e[114]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[115]||(e[115]=a(`julia create_relerr_symmetry_post (
+;
+ u,
+ setup,
+ method,
+ psolver,
+ Δt,
+ nstep,
+ g
+)
Create a-posteriori symmetry error.
source
`,3))]),t("details",g1,[t("summary",null,[e[116]||(e[116]=t("a",{id:"NeuralClosure.create_relerr_symmetry_prior-Tuple{}",href:"#NeuralClosure.create_relerr_symmetry_prior-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_relerr_symmetry_prior")],-1)),e[117]||(e[117]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[118]||(e[118]=a('julia create_relerr_symmetry_prior (; u, setup, g)
Create a-priori equivariance error.
source
',3))]),t("details",k1,[t("summary",null,[e[119]||(e[119]=t("a",{id:"NeuralClosure.train-Tuple{}",href:"#NeuralClosure.train-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.train")],-1)),e[120]||(e[120]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[121]||(e[121]=a(`julia train (
+;
+ dataloader,
+ loss,
+ trainstate,
+ niter,
+ callback,
+ callbackstate,
+ λ
+)
Update parameters θ
to minimize loss(dataloader(), θ)
using the optimiser opt
for niter
iterations.
Return the a new named tuple (; opt, θ, callbackstate)
with updated state and parameters.
source
`,4))]),t("details",b1,[t("summary",null,[e[122]||(e[122]=t("a",{id:"NeuralClosure.trainepoch-Tuple{}",href:"#NeuralClosure.trainepoch-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.trainepoch")],-1)),e[123]||(e[123]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[124]||(e[124]=a(`julia trainepoch (
+;
+ dataloader,
+ loss,
+ trainstate,
+ callback,
+ callbackstate,
+ device,
+ noiselevel,
+ λ
+)
Update parameters θ
to minimize loss(dataloader(), θ)
using the optimiser opt
for niter
iterations.
Return the a new named tuple (; opt, θ, callbackstate)
with updated state and parameters.
source
`,4))]),e[173]||(e[173]=t("h2",{id:"Neural-architectures",tabindex:"-1"},[s("Neural architectures "),t("a",{class:"header-anchor",href:"#Neural-architectures","aria-label":'Permalink to "Neural architectures {#Neural-architectures}"'},"")],-1)),e[174]||(e[174]=t("p",null,"We provide neural architectures: A convolutional neural network (CNN), group convolutional neural networks (G-CNN) and a Fourier neural operator (FNO).",-1)),t("details",y1,[t("summary",null,[e[125]||(e[125]=t("a",{id:"NeuralClosure.cnn-Tuple{}",href:"#NeuralClosure.cnn-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.cnn")],-1)),e[126]||(e[126]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[127]||(e[127]=a(`julia cnn (
+;
+ setup,
+ radii,
+ channels,
+ activations,
+ use_bias,
+ channel_augmenter,
+ rng
+)
Create CNN closure model. Return a tuple (closure, θ)
where θ
are the initial parameters and closure(u, θ)
predicts the commutator error.
source
`,3))]),t("details",x1,[t("summary",null,[e[128]||(e[128]=t("a",{id:"NeuralClosure.GroupConv2D",href:"#NeuralClosure.GroupConv2D"},[t("span",{class:"jlbinding"},"NeuralClosure.GroupConv2D")],-1)),e[129]||(e[129]=s()),i(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),e[130]||(e[130]=a('julia struct GroupConv2D{C} <: LuxCore.AbstractLuxLayer
Group-equivariant convolutional layer – with respect to the p4 group. The layer is equivariant to rotations and translations of the input vector field.
The kwargs
are passed to the Conv
layer.
The layer has three variants:
If islifting
then it lifts a vector input (u1, u2)
into a rotation-state vector (v1, v2, v3, v4)
.
If isprojecting
, it projects a rotation-state vector (u1, u2, u3, v4)
into a vector (v1, v2)
.
Otherwise, it cyclically transforms the rotation-state vector (u1, u2, u3, u4)
into a new rotation-state vector (v1, v2, v3, v4)
.
Fields
islifting
isprojecting
cin
cout
conv
source
',8))]),t("details",E1,[t("summary",null,[e[131]||(e[131]=t("a",{id:"NeuralClosure.gcnn-Tuple{}",href:"#NeuralClosure.gcnn-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.gcnn")],-1)),e[132]||(e[132]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[133]||(e[133]=a('julia gcnn (; setup, radii, channels, activations, use_bias, rng)
Create CNN closure model. Return a tuple (closure, θ)
where θ
are the initial parameters and closure(u, θ)
predicts the commutator error.
source
',3))]),t("details",f1,[t("summary",null,[e[134]||(e[134]=t("a",{id:"NeuralClosure.rot2",href:"#NeuralClosure.rot2"},[t("span",{class:"jlbinding"},"NeuralClosure.rot2")],-1)),e[135]||(e[135]=s()),i(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[136]||(e[136]=a('Rotate the field u
by 90 degrees counter-clockwise r - 1
times.
source
',3))]),t("details",w1,[t("summary",null,[e[137]||(e[137]=t("a",{id:"NeuralClosure.rot2-Union{Tuple{T}, Tuple{Tuple{T, T}, Any}} where T",href:"#NeuralClosure.rot2-Union{Tuple{T}, Tuple{Tuple{T, T}, Any}} where T"},[t("span",{class:"jlbinding"},"NeuralClosure.rot2")],-1)),e[138]||(e[138]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[139]||(e[139]=a('julia rot2 (u :: Tuple{T, T} , r) -> Union{Nothing, Tuple{Any, Any}}
Rotate vector fields [ux;;; uy]
source
',3))]),t("details",v1,[t("summary",null,[e[140]||(e[140]=t("a",{id:"NeuralClosure.rot2stag-Tuple{Any, Any}",href:"#NeuralClosure.rot2stag-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.rot2stag")],-1)),e[141]||(e[141]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[142]||(e[142]=a('julia rot2stag (u, g) -> Any
Rotate staggered grid velocity field. See also rot2
.
source
',3))]),t("details",H1,[t("summary",null,[e[143]||(e[143]=t("a",{id:"NeuralClosure.vecrot2-Tuple{Any, Any}",href:"#NeuralClosure.vecrot2-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.vecrot2")],-1)),e[144]||(e[144]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[145]||(e[145]=a('julia vecrot2 (u, r) -> Any
Rotate vector fields [ux;;; uy]
source
',3))]),t("details",j1,[t("summary",null,[e[146]||(e[146]=t("a",{id:"NeuralClosure.FourierLayer",href:"#NeuralClosure.FourierLayer"},[t("span",{class:"jlbinding"},"NeuralClosure.FourierLayer")],-1)),e[147]||(e[147]=s()),i(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),e[148]||(e[148]=a('julia struct FourierLayer{D, A, F} <: LuxCore.AbstractLuxLayer
Fourier layer operating on uniformly discretized functions.
Some important sizes:
dimension
: Spatial dimension, e.g. Dimension(2)
or Dimension(3)
.
(nx..., cin, nsample)
: Input size
(nx..., cout, nsample)
: Output size
nx = fill(n, dimension())
: Number of points in each spatial dimension
n ≥ kmax
: Same number of points in each spatial dimension, must be larger than cut-off wavenumber
kmax
: Cut-off wavenumber
nsample
: Number of input samples (treated independently)
Fields
dimension
kmax
cin
cout
σ
init_weight
source
',7))]),t("details",C1,[t("summary",null,[e[149]||(e[149]=t("a",{id:"NeuralClosure.fno-Tuple{}",href:"#NeuralClosure.fno-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.fno")],-1)),e[150]||(e[150]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[151]||(e[151]=a('julia fno (; setup, kmax, c, σ, ψ, rng, kwargs ... )
Create FNO closure model. Return a tuple (closure, θ)
where θ
are the initial parameters and closure(V, θ)
predicts the commutator error.
source
',3))]),e[175]||(e[175]=t("h2",{id:"Data-generation",tabindex:"-1"},[s("Data generation "),t("a",{class:"header-anchor",href:"#Data-generation","aria-label":'Permalink to "Data generation {#Data-generation}"'},"")],-1)),t("details",M1,[t("summary",null,[e[152]||(e[152]=t("a",{id:"NeuralClosure.create_io_arrays-Tuple{Any, Any}",href:"#NeuralClosure.create_io_arrays-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_io_arrays")],-1)),e[153]||(e[153]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[158]||(e[158]=a('julia create_io_arrays (data, setup) -> NamedTuple
',1)),t("p",null,[e[156]||(e[156]=s("Create ")),t("mjx-container",L1,[(o(),n("svg",V1,e[154]||(e[154]=[a(' ',1)]))),e[155]||(e[155]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,","),t("mi",null,"c"),t("mo",{stretchy:"false"},")")])],-1))]),e[157]||(e[157]=s(" pairs for a-priori training."))]),e[159]||(e[159]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/lib/NeuralClosure/src/data_generation.jl#L228",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",N1,[t("summary",null,[e[160]||(e[160]=t("a",{id:"NeuralClosure.create_les_data-Tuple{}",href:"#NeuralClosure.create_les_data-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_les_data")],-1)),e[161]||(e[161]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[162]||(e[162]=a(`julia create_les_data (
+;
+ D,
+ Re,
+ lims,
+ nles,
+ ndns,
+ filters,
+ tburn,
+ tsim,
+ savefreq,
+ Δt,
+ method,
+ create_psolver,
+ backend,
+ icfunc,
+ processors,
+ rng,
+ filenames,
+ kwargs ...
+)
Create filtered DNS data.
source
`,3))]),t("details",Z1,[t("summary",null,[e[163]||(e[163]=t("a",{id:"NeuralClosure.filtersaver-NTuple{6, Any}",href:"#NeuralClosure.filtersaver-NTuple{6, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.filtersaver")],-1)),e[164]||(e[164]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[165]||(e[165]=a(`julia filtersaver (
+ dns,
+ les,
+ filters,
+ compression,
+ psolver_dns,
+ psolver_les;
+ nupdate,
+ filenames,
+ F,
+ p
+)
Save filtered DNS data.
source
`,3))])])}const z1=r(T,[["render",D1]]);export{I1 as __pageData,z1 as default};
diff --git a/previews/PR126/assets/manual_closure.md.DJlmWyys.lean.js b/previews/PR126/assets/manual_closure.md.DJlmWyys.lean.js
new file mode 100644
index 00000000..975ca61c
--- /dev/null
+++ b/previews/PR126/assets/manual_closure.md.DJlmWyys.lean.js
@@ -0,0 +1,112 @@
+import{_ as r,c as n,a5 as a,j as t,a as s,G as i,B as d,o}from"./chunks/framework.BSoZtefh.js";const I1=JSON.parse('{"title":"Neural closure models","description":"","frontmatter":{},"headers":[],"relativePath":"manual/closure.md","filePath":"manual/closure.md","lastUpdated":null}'),T={name:"manual/closure.md"},p={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},Q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.243ex"},xmlns:"http://www.w3.org/2000/svg",width:"17.749ex",height:"7.618ex",role:"img",focusable:"false",viewBox:"0 -1933.5 7845 3367","aria-hidden":"true"},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.633ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 722 683","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.239ex",height:"1.753ex",role:"img",focusable:"false",viewBox:"0 -693 3199.6 775","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.243ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.494ex",height:"7.618ex",role:"img",focusable:"false",viewBox:"0 -1933.5 9500.4 3367","aria-hidden":"true"},b={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"2.378ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 1051 683","aria-hidden":"true"},x={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.695ex",height:"1.538ex",role:"img",focusable:"false",viewBox:"0 -680 749 680","aria-hidden":"true"},f={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.778ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 786 727","aria-hidden":"true"},v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},H={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.26ex",height:"2.98ex",role:"img",focusable:"false",viewBox:"0 -1067 7187 1317","aria-hidden":"true"},j={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"2.378ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 1051 683","aria-hidden":"true"},M={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},L={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.633ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 722 683","aria-hidden":"true"},V={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.98ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 433 453","aria-hidden":"true"},Z={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.105ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4908.2 1000","aria-hidden":"true"},F={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.408ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 2390.6 705","aria-hidden":"true"},O={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},S={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.243ex"},xmlns:"http://www.w3.org/2000/svg",width:"26.935ex",height:"7.618ex",role:"img",focusable:"false",viewBox:"0 -1933.5 11905.1 3367","aria-hidden":"true"},B={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},z={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},X={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},P={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},W={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},$={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.593ex",role:"img",focusable:"false",viewBox:"0 -693 572 704","aria-hidden":"true"},K={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.98ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 433 453","aria-hidden":"true"},_={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},t1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.687ex",height:"2.57ex",role:"img",focusable:"false",viewBox:"0 -886.1 11353.9 1136.1","aria-hidden":"true"},e1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},s1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.483ex",height:"2.565ex",role:"img",focusable:"false",viewBox:"0 -883.9 9053.6 1133.9","aria-hidden":"true"},a1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.355ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.035ex",height:"1.926ex",role:"img",focusable:"false",viewBox:"0 -694 899.6 851.1","aria-hidden":"true"},i1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},n1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.023ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.061ex",height:"1.618ex",role:"img",focusable:"false",viewBox:"0 -705 469 715","aria-hidden":"true"},o1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"5.117ex",height:"1.892ex",role:"img",focusable:"false",viewBox:"0 -836.1 2261.7 836.1","aria-hidden":"true"},d1={class:"jldocstring custom-block",open:""},T1={class:"jldocstring custom-block",open:""},p1={class:"jldocstring custom-block",open:""},Q1={class:"jldocstring custom-block",open:""},m1={class:"jldocstring custom-block",open:""},h1={class:"jldocstring custom-block",open:""},u1={class:"jldocstring custom-block",open:""},c1={class:"jldocstring custom-block",open:""},g1={class:"jldocstring custom-block",open:""},k1={class:"jldocstring custom-block",open:""},b1={class:"jldocstring custom-block",open:""},y1={class:"jldocstring custom-block",open:""},x1={class:"jldocstring custom-block",open:""},E1={class:"jldocstring custom-block",open:""},f1={class:"jldocstring custom-block",open:""},w1={class:"jldocstring custom-block",open:""},v1={class:"jldocstring custom-block",open:""},H1={class:"jldocstring custom-block",open:""},j1={class:"jldocstring custom-block",open:""},C1={class:"jldocstring custom-block",open:""},M1={class:"jldocstring custom-block",open:""},L1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},V1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.04ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2227.7 1000","aria-hidden":"true"},N1={class:"jldocstring custom-block",open:""},Z1={class:"jldocstring custom-block",open:""};function D1(F1,e,A1,O1,S1,B1){const l=d("Badge");return o(),n("div",null,[e[166]||(e[166]=a(`Neural closure models NeuralClosure
These features are experimental, and require cloning IncompressibleNavierStokes from GitHub:
sh git clone https://github.com/agdestein/IncompressibleNavierStokes.jl
+cd IncompressibleNavierStokes/lib/NeuralClosure
Large eddy simulation, a closure model is required. With IncompressibleNavierStokes, a neural closure model can be trained on filtered DNS data. The discrete DNS equations are given by
`,3)),t("mjx-container",p,[(o(),n("svg",Q,e[0]||(e[0]=[a(' ',1)]))),e[1]||(e[1]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mi",null,"M"),t("mi",null,"u")]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mn",null,"0"),t("mo",null,",")])]),t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"u")]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mi",null,"u"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("mi",null,"G"),t("mi",null,"p"),t("mo",null,".")])])])])],-1))]),t("p",null,[e[6]||(e[6]=s("Applying a spatial filter ")),t("mjx-container",m,[(o(),n("svg",h,e[2]||(e[2]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"3A6",d:"M312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415Z",style:{"stroke-width":"3"}})])])],-1)]))),e[3]||(e[3]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Φ")])],-1))]),e[7]||(e[7]=s(", the extracted large scale components ")),t("mjx-container",u,[(o(),n("svg",c,e[4]||(e[4]=[a(' ',1)]))),e[5]||(e[5]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,"="),t("mi",{mathvariant:"normal"},"Φ"),t("mi",null,"u")])],-1))]),e[8]||(e[8]=s(" are governed by the equation"))]),t("mjx-container",g,[(o(),n("svg",k,e[9]||(e[9]=[a(' ',1)]))),e[10]||(e[10]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mi",null,"M"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mn",null,"0"),t("mo",null,",")])]),t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])])]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mi",null,"c"),t("mo",null,"−"),t("mi",null,"G"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"p"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,",")])])])])],-1))]),t("p",null,[e[29]||(e[29]=s("where the discretizations ")),t("mjx-container",b,[(o(),n("svg",y,e[11]||(e[11]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D440",d:"M289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629Z",style:{"stroke-width":"3"}})])])],-1)]))),e[12]||(e[12]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"M")])],-1))]),e[30]||(e[30]=s(", ")),t("mjx-container",x,[(o(),n("svg",E,e[13]||(e[13]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D439",d:"M48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1Z",style:{"stroke-width":"3"}})])])],-1)]))),e[14]||(e[14]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"F")])],-1))]),e[31]||(e[31]=s(", and ")),t("mjx-container",f,[(o(),n("svg",w,e[15]||(e[15]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D43A",d:"M50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q492 659 471 656T418 643T357 615T294 567T236 496T189 394T158 260Q156 242 156 221Q156 173 170 136T206 79T256 45T308 28T353 24Q407 24 452 47T514 106Q517 114 529 161T541 214Q541 222 528 224T468 227H431Q425 233 425 235T427 254Q431 267 437 273H454Q494 271 594 271Q634 271 659 271T695 272T707 272Q721 272 721 263Q721 261 719 249Q714 230 709 228Q706 227 694 227Q674 227 653 224Q646 221 643 215T629 164Q620 131 614 108Q589 6 586 3Q584 1 581 1Q571 1 553 21T530 52Q530 53 528 52T522 47Q448 -22 322 -22Q201 -22 126 55T50 252Z",style:{"stroke-width":"3"}})])])],-1)]))),e[16]||(e[16]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"G")])],-1))]),e[32]||(e[32]=s(" are adapted to the size of their inputs and ")),t("mjx-container",v,[(o(),n("svg",H,e[17]||(e[17]=[a(' ',1)]))),e[18]||(e[18]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"c"),t("mo",null,"="),t("mover",null,[t("mrow",null,[t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mi",null,"u"),t("mo",{stretchy:"false"},")")]),t("mo",{accent:"true"},"―")]),t("mo",null,"−"),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("mo",{stretchy:"false"},")")])],-1))]),e[33]||(e[33]=s(" is a commutator error. We here assumed that ")),t("mjx-container",j,[(o(),n("svg",C,e[19]||(e[19]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D440",d:"M289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629Z",style:{"stroke-width":"3"}})])])],-1)]))),e[20]||(e[20]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"M")])],-1))]),e[34]||(e[34]=s(" and ")),t("mjx-container",M,[(o(),n("svg",L,e[21]||(e[21]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"3A6",d:"M312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415Z",style:{"stroke-width":"3"}})])])],-1)]))),e[22]||(e[22]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Φ")])],-1))]),e[35]||(e[35]=s(" commute, which is the case for face averaging filters. Replacing ")),t("mjx-container",V,[(o(),n("svg",N,e[23]||(e[23]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D450",d:"M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z",style:{"stroke-width":"3"}})])])],-1)]))),e[24]||(e[24]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"c")])],-1))]),e[36]||(e[36]=s(" with a parameterized closure model ")),t("mjx-container",Z,[(o(),n("svg",D,e[25]||(e[25]=[a(' ',1)]))),e[26]||(e[26]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"m"),t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,","),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mo",null,"≈"),t("mi",null,"c")])],-1))]),e[37]||(e[37]=s(" gives the LES equations for the approximate large scale velocity ")),t("mjx-container",F,[(o(),n("svg",A,e[27]||(e[27]=[a(' ',1)]))),e[28]||(e[28]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,"≈"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])])])],-1))])]),t("mjx-container",O,[(o(),n("svg",S,e[38]||(e[38]=[a(' ',1)]))),e[39]||(e[39]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mi",null,"M"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mn",null,"0"),t("mo",null,",")])]),t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])])]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mi",null,"m"),t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,","),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("mi",null,"G"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"q"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,".")])])])])],-1))]),e[167]||(e[167]=t("h2",{id:"NeuralClosure-module",tabindex:"-1"},[s("NeuralClosure module "),t("a",{class:"header-anchor",href:"#NeuralClosure-module","aria-label":'Permalink to "NeuralClosure module {#NeuralClosure-module}"'},"")],-1)),e[168]||(e[168]=t("p",null,"IncompressibleNavierStokes provides a NeuralClosure module.",-1)),t("details",B,[t("summary",null,[e[40]||(e[40]=t("a",{id:"NeuralClosure.NeuralClosure",href:"#NeuralClosure.NeuralClosure"},[t("span",{class:"jlbinding"},"NeuralClosure.NeuralClosure")],-1)),e[41]||(e[41]=s()),i(l,{type:"info",class:"jlObjectType jlModule",text:"Module"})]),e[42]||(e[42]=t("p",null,"Neural closure modelling tools.",-1)),e[43]||(e[43]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/lib/NeuralClosure/src/NeuralClosure.jl#L1-L3",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",R,[t("summary",null,[e[44]||(e[44]=t("a",{id:"NeuralClosure.collocate-Tuple{Any}",href:"#NeuralClosure.collocate-Tuple{Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.collocate")],-1)),e[45]||(e[45]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[46]||(e[46]=a('Interpolate velocity components to volume centers.
source
',3))]),t("details",I,[t("summary",null,[e[47]||(e[47]=t("a",{id:"NeuralClosure.create_closure-Tuple",href:"#NeuralClosure.create_closure-Tuple"},[t("span",{class:"jlbinding"},"NeuralClosure.create_closure")],-1)),e[48]||(e[48]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[49]||(e[49]=a('julia create_closure (layers ... ; rng)
Create neural closure model from layers.
source
',3))]),t("details",z,[t("summary",null,[e[50]||(e[50]=t("a",{id:"NeuralClosure.decollocate-Tuple{Any}",href:"#NeuralClosure.decollocate-Tuple{Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.decollocate")],-1)),e[51]||(e[51]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[52]||(e[52]=a('julia decollocate (u) -> Any
Interpolate closure force from volume centers to volume faces.
source
',3))]),t("details",G,[t("summary",null,[e[53]||(e[53]=t("a",{id:"NeuralClosure.wrappedclosure-Tuple{Any, Any}",href:"#NeuralClosure.wrappedclosure-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.wrappedclosure")],-1)),e[54]||(e[54]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[55]||(e[55]=a(`julia wrappedclosure (
+ m,
+ setup
+) -> NeuralClosure . var"#neuralclosure#1"
Wrap closure model and parameters so that it can be used in the solver.
source
`,3))]),e[169]||(e[169]=t("h2",{id:"filters",tabindex:"-1"},[s("Filters "),t("a",{class:"header-anchor",href:"#filters","aria-label":'Permalink to "Filters"'},"")],-1)),e[170]||(e[170]=t("p",null,"The following filters are available:",-1)),t("details",q,[t("summary",null,[e[56]||(e[56]=t("a",{id:"NeuralClosure.AbstractFilter",href:"#NeuralClosure.AbstractFilter"},[t("span",{class:"jlbinding"},"NeuralClosure.AbstractFilter")],-1)),e[57]||(e[57]=s()),i(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),e[58]||(e[58]=a('julia abstract type AbstractFilter
Discrete DNS filter.
Subtypes ConcreteFilter
should implement the in-place method:
(::ConcreteFilter)(v, u, setup_les, compression)
which filters the DNS field u
and put result in LES field v
. Then the out-of place method:
(::ConcreteFilter)(u, setup_les, compression)
automatically becomes available.
Fields
source
',9))]),t("details",X,[t("summary",null,[e[59]||(e[59]=t("a",{id:"NeuralClosure.FaceAverage",href:"#NeuralClosure.FaceAverage"},[t("span",{class:"jlbinding"},"NeuralClosure.FaceAverage")],-1)),e[60]||(e[60]=s()),i(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),e[61]||(e[61]=a('julia struct FaceAverage <: NeuralClosure.AbstractFilter
Average fine grid velocity field over coarse volume face.
Fields
source
',4))]),t("details",J,[t("summary",null,[e[62]||(e[62]=t("a",{id:"NeuralClosure.VolumeAverage",href:"#NeuralClosure.VolumeAverage"},[t("span",{class:"jlbinding"},"NeuralClosure.VolumeAverage")],-1)),e[63]||(e[63]=s()),i(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),e[64]||(e[64]=a('julia struct VolumeAverage <: NeuralClosure.AbstractFilter
Average fine grid velocity field over coarse volume.
Fields
source
',4))]),t("details",P,[t("summary",null,[e[65]||(e[65]=t("a",{id:"NeuralClosure.reconstruct!-NTuple{5, Any}",href:"#NeuralClosure.reconstruct!-NTuple{5, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.reconstruct!")],-1)),e[66]||(e[66]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[67]||(e[67]=a('julia reconstruct! (u, v, setup_dns, setup_les, comp) -> Any
Reconstruct DNS velocity u
from LES velocity v
.
source
',3))]),t("details",U,[t("summary",null,[e[68]||(e[68]=t("a",{id:"NeuralClosure.reconstruct-NTuple{4, Any}",href:"#NeuralClosure.reconstruct-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.reconstruct")],-1)),e[69]||(e[69]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[70]||(e[70]=a('julia reconstruct (v, setup_dns, setup_les, comp) -> Any
Reconstruct DNS velocity field. See also reconstruct!
.
source
',3))]),e[171]||(e[171]=t("h2",{id:"training",tabindex:"-1"},[s("Training "),t("a",{class:"header-anchor",href:"#training","aria-label":'Permalink to "Training"'},"")],-1)),t("p",null,[e[75]||(e[75]=s("To improve the model parameters, we exploit exact filtered DNS data ")),t("mjx-container",W,[(o(),n("svg",$,e[71]||(e[71]=[a(' ',1)]))),e[72]||(e[72]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])])])],-1))]),e[76]||(e[76]=s(" and exact commutator errors ")),t("mjx-container",K,[(o(),n("svg",Y,e[73]||(e[73]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D450",d:"M34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159Z",style:{"stroke-width":"3"}})])])],-1)]))),e[74]||(e[74]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"c")])],-1))]),e[77]||(e[77]=s(" obtained through DNS. The model is trained by minimizing the a priori loss function"))]),t("mjx-container",_,[(o(),n("svg",t1,e[78]||(e[78]=[a(' ',1)]))),e[79]||(e[79]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msup",null,[t("mi",null,"L"),t("mtext",null,"prior")]),t("mo",{stretchy:"false"},"("),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mo",null,"="),t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mi",null,"m"),t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,","),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("mi",null,"c"),t("msup",null,[t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mn",null,"2")]),t("mo",null,",")])],-1))]),e[172]||(e[172]=t("p",null,"or the a posteriori loss function",-1)),t("mjx-container",e1,[(o(),n("svg",s1,e[80]||(e[80]=[a(' ',1)]))),e[81]||(e[81]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msup",null,[t("mi",null,"L"),t("mtext",null,"post")]),t("mo",{stretchy:"false"},"("),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mo",null,"="),t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("msub",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])]),t("mi",null,"θ")]),t("mo",null,"−"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("msup",null,[t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mn",null,"2")]),t("mo",null,",")])],-1))]),t("p",null,[e[88]||(e[88]=s("where ")),t("mjx-container",a1,[(o(),n("svg",l1,e[82]||(e[82]=[a(' ',1)]))),e[83]||(e[83]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"¯")])]),t("mi",null,"θ")])])],-1))]),e[89]||(e[89]=s(" is the solution to the LES equation for the given parameters ")),t("mjx-container",i1,[(o(),n("svg",n1,e[84]||(e[84]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D703",d:"M35 200Q35 302 74 415T180 610T319 704Q320 704 327 704T339 705Q393 701 423 656Q462 596 462 495Q462 380 417 261T302 66T168 -10H161Q125 -10 99 10T60 63T41 130T35 200ZM383 566Q383 668 330 668Q294 668 260 623T204 521T170 421T157 371Q206 370 254 370L351 371Q352 372 359 404T375 484T383 566ZM113 132Q113 26 166 26Q181 26 198 36T239 74T287 161T335 307L340 324H145Q145 321 136 286T120 208T113 132Z",style:{"stroke-width":"3"}})])])],-1)]))),e[85]||(e[85]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"θ")])],-1))]),e[90]||(e[90]=s(". The prior loss is easy to evaluate and easy to differentiate, as it does not involve solving the ODE. However, minimizing ")),t("mjx-container",o1,[(o(),n("svg",r1,e[86]||(e[86]=[a(' ',1)]))),e[87]||(e[87]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"L"),t("mtext",null,"prior")])])],-1))]),e[91]||(e[91]=s(" does not take into account the effect of the prediction error on the LES solution error. The posterior loss does, but has a longer computational chain involving solving the LES ODE."))]),t("details",d1,[t("summary",null,[e[92]||(e[92]=t("a",{id:"NeuralClosure.create_callback-Tuple{Any}",href:"#NeuralClosure.create_callback-Tuple{Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_callback")],-1)),e[93]||(e[93]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[94]||(e[94]=a(`julia create_callback (
+ err;
+ θ,
+ callbackstate,
+ displayref,
+ displayfig,
+ displayupdates,
+ figfile,
+ nupdate
+)
Create convergence plot for relative error between f(x, θ)
and y
. At each callback, plot is updated and current error is printed.
If state
is nonempty, it also plots previous convergence.
If not using interactive GLMakie window, set displayupdates
to true
.
source
`,5))]),t("details",T1,[t("summary",null,[e[95]||(e[95]=t("a",{id:"NeuralClosure.create_dataloader_post-Tuple{Any}",href:"#NeuralClosure.create_dataloader_post-Tuple{Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_dataloader_post")],-1)),e[96]||(e[96]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[97]||(e[97]=a(`julia create_dataloader_post (
+ trajectories;
+ ntrajectory,
+ nunroll,
+ device
+)
Create trajectory dataloader.
source
`,3))]),t("details",p1,[t("summary",null,[e[98]||(e[98]=t("a",{id:"NeuralClosure.create_dataloader_prior-Tuple{Any}",href:"#NeuralClosure.create_dataloader_prior-Tuple{Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_dataloader_prior")],-1)),e[99]||(e[99]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[100]||(e[100]=a(`julia create_dataloader_prior (
+ data;
+ batchsize,
+ device
+) -> NeuralClosure . var"#dataloader#40" {Int64}
Create dataloader that uses a batch of batchsize
random samples from data
at each evaluation. The batch is moved to device
.
source
`,3))]),t("details",Q1,[t("summary",null,[e[101]||(e[101]=t("a",{id:"NeuralClosure.create_loss_post-Tuple{}",href:"#NeuralClosure.create_loss_post-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_loss_post")],-1)),e[102]||(e[102]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[103]||(e[103]=a(`julia create_loss_post (
+;
+ setup,
+ method,
+ psolver,
+ closure_model,
+ nsubstep
+)
Create a-posteriori loss function.
source
`,3))]),t("details",m1,[t("summary",null,[e[104]||(e[104]=t("a",{id:"NeuralClosure.create_loss_prior",href:"#NeuralClosure.create_loss_prior"},[t("span",{class:"jlbinding"},"NeuralClosure.create_loss_prior")],-1)),e[105]||(e[105]=s()),i(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[106]||(e[106]=a(`julia create_loss_prior (
+ f
+) -> NeuralClosure . var"#loss_prior#53" {_A, NeuralClosure . var"#51#52" } where _A
+create_loss_prior (
+ f,
+ normalize
+) -> NeuralClosure . var"#loss_prior#53"
Return mean squared error loss for the predictor f
.
source
`,3))]),t("details",h1,[t("summary",null,[e[107]||(e[107]=t("a",{id:"NeuralClosure.create_relerr_post-Tuple{}",href:"#NeuralClosure.create_relerr_post-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_relerr_post")],-1)),e[108]||(e[108]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[109]||(e[109]=a(`julia create_relerr_post (
+;
+ data,
+ setup,
+ method,
+ psolver,
+ closure_model,
+ nsubstep
+)
Create a-posteriori relative error.
source
`,3))]),t("details",u1,[t("summary",null,[e[110]||(e[110]=t("a",{id:"NeuralClosure.create_relerr_prior-Tuple{Any, Any, Any}",href:"#NeuralClosure.create_relerr_prior-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_relerr_prior")],-1)),e[111]||(e[111]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[112]||(e[112]=a('julia create_relerr_prior (f, x, y) -> NeuralClosure . var"#54#55"
Create a-priori error.
source
',3))]),t("details",c1,[t("summary",null,[e[113]||(e[113]=t("a",{id:"NeuralClosure.create_relerr_symmetry_post-Tuple{}",href:"#NeuralClosure.create_relerr_symmetry_post-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_relerr_symmetry_post")],-1)),e[114]||(e[114]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[115]||(e[115]=a(`julia create_relerr_symmetry_post (
+;
+ u,
+ setup,
+ method,
+ psolver,
+ Δt,
+ nstep,
+ g
+)
Create a-posteriori symmetry error.
source
`,3))]),t("details",g1,[t("summary",null,[e[116]||(e[116]=t("a",{id:"NeuralClosure.create_relerr_symmetry_prior-Tuple{}",href:"#NeuralClosure.create_relerr_symmetry_prior-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_relerr_symmetry_prior")],-1)),e[117]||(e[117]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[118]||(e[118]=a('julia create_relerr_symmetry_prior (; u, setup, g)
Create a-priori equivariance error.
source
',3))]),t("details",k1,[t("summary",null,[e[119]||(e[119]=t("a",{id:"NeuralClosure.train-Tuple{}",href:"#NeuralClosure.train-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.train")],-1)),e[120]||(e[120]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[121]||(e[121]=a(`julia train (
+;
+ dataloader,
+ loss,
+ trainstate,
+ niter,
+ callback,
+ callbackstate,
+ λ
+)
Update parameters θ
to minimize loss(dataloader(), θ)
using the optimiser opt
for niter
iterations.
Return the a new named tuple (; opt, θ, callbackstate)
with updated state and parameters.
source
`,4))]),t("details",b1,[t("summary",null,[e[122]||(e[122]=t("a",{id:"NeuralClosure.trainepoch-Tuple{}",href:"#NeuralClosure.trainepoch-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.trainepoch")],-1)),e[123]||(e[123]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[124]||(e[124]=a(`julia trainepoch (
+;
+ dataloader,
+ loss,
+ trainstate,
+ callback,
+ callbackstate,
+ device,
+ noiselevel,
+ λ
+)
Update parameters θ
to minimize loss(dataloader(), θ)
using the optimiser opt
for niter
iterations.
Return the a new named tuple (; opt, θ, callbackstate)
with updated state and parameters.
source
`,4))]),e[173]||(e[173]=t("h2",{id:"Neural-architectures",tabindex:"-1"},[s("Neural architectures "),t("a",{class:"header-anchor",href:"#Neural-architectures","aria-label":'Permalink to "Neural architectures {#Neural-architectures}"'},"")],-1)),e[174]||(e[174]=t("p",null,"We provide neural architectures: A convolutional neural network (CNN), group convolutional neural networks (G-CNN) and a Fourier neural operator (FNO).",-1)),t("details",y1,[t("summary",null,[e[125]||(e[125]=t("a",{id:"NeuralClosure.cnn-Tuple{}",href:"#NeuralClosure.cnn-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.cnn")],-1)),e[126]||(e[126]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[127]||(e[127]=a(`julia cnn (
+;
+ setup,
+ radii,
+ channels,
+ activations,
+ use_bias,
+ channel_augmenter,
+ rng
+)
Create CNN closure model. Return a tuple (closure, θ)
where θ
are the initial parameters and closure(u, θ)
predicts the commutator error.
source
`,3))]),t("details",x1,[t("summary",null,[e[128]||(e[128]=t("a",{id:"NeuralClosure.GroupConv2D",href:"#NeuralClosure.GroupConv2D"},[t("span",{class:"jlbinding"},"NeuralClosure.GroupConv2D")],-1)),e[129]||(e[129]=s()),i(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),e[130]||(e[130]=a('julia struct GroupConv2D{C} <: LuxCore.AbstractLuxLayer
Group-equivariant convolutional layer – with respect to the p4 group. The layer is equivariant to rotations and translations of the input vector field.
The kwargs
are passed to the Conv
layer.
The layer has three variants:
If islifting
then it lifts a vector input (u1, u2)
into a rotation-state vector (v1, v2, v3, v4)
.
If isprojecting
, it projects a rotation-state vector (u1, u2, u3, v4)
into a vector (v1, v2)
.
Otherwise, it cyclically transforms the rotation-state vector (u1, u2, u3, u4)
into a new rotation-state vector (v1, v2, v3, v4)
.
Fields
islifting
isprojecting
cin
cout
conv
source
',8))]),t("details",E1,[t("summary",null,[e[131]||(e[131]=t("a",{id:"NeuralClosure.gcnn-Tuple{}",href:"#NeuralClosure.gcnn-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.gcnn")],-1)),e[132]||(e[132]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[133]||(e[133]=a('julia gcnn (; setup, radii, channels, activations, use_bias, rng)
Create CNN closure model. Return a tuple (closure, θ)
where θ
are the initial parameters and closure(u, θ)
predicts the commutator error.
source
',3))]),t("details",f1,[t("summary",null,[e[134]||(e[134]=t("a",{id:"NeuralClosure.rot2",href:"#NeuralClosure.rot2"},[t("span",{class:"jlbinding"},"NeuralClosure.rot2")],-1)),e[135]||(e[135]=s()),i(l,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[136]||(e[136]=a('Rotate the field u
by 90 degrees counter-clockwise r - 1
times.
source
',3))]),t("details",w1,[t("summary",null,[e[137]||(e[137]=t("a",{id:"NeuralClosure.rot2-Union{Tuple{T}, Tuple{Tuple{T, T}, Any}} where T",href:"#NeuralClosure.rot2-Union{Tuple{T}, Tuple{Tuple{T, T}, Any}} where T"},[t("span",{class:"jlbinding"},"NeuralClosure.rot2")],-1)),e[138]||(e[138]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[139]||(e[139]=a('julia rot2 (u :: Tuple{T, T} , r) -> Union{Nothing, Tuple{Any, Any}}
Rotate vector fields [ux;;; uy]
source
',3))]),t("details",v1,[t("summary",null,[e[140]||(e[140]=t("a",{id:"NeuralClosure.rot2stag-Tuple{Any, Any}",href:"#NeuralClosure.rot2stag-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.rot2stag")],-1)),e[141]||(e[141]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[142]||(e[142]=a('julia rot2stag (u, g) -> Any
Rotate staggered grid velocity field. See also rot2
.
source
',3))]),t("details",H1,[t("summary",null,[e[143]||(e[143]=t("a",{id:"NeuralClosure.vecrot2-Tuple{Any, Any}",href:"#NeuralClosure.vecrot2-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.vecrot2")],-1)),e[144]||(e[144]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[145]||(e[145]=a('julia vecrot2 (u, r) -> Any
Rotate vector fields [ux;;; uy]
source
',3))]),t("details",j1,[t("summary",null,[e[146]||(e[146]=t("a",{id:"NeuralClosure.FourierLayer",href:"#NeuralClosure.FourierLayer"},[t("span",{class:"jlbinding"},"NeuralClosure.FourierLayer")],-1)),e[147]||(e[147]=s()),i(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),e[148]||(e[148]=a('julia struct FourierLayer{D, A, F} <: LuxCore.AbstractLuxLayer
Fourier layer operating on uniformly discretized functions.
Some important sizes:
dimension
: Spatial dimension, e.g. Dimension(2)
or Dimension(3)
.
(nx..., cin, nsample)
: Input size
(nx..., cout, nsample)
: Output size
nx = fill(n, dimension())
: Number of points in each spatial dimension
n ≥ kmax
: Same number of points in each spatial dimension, must be larger than cut-off wavenumber
kmax
: Cut-off wavenumber
nsample
: Number of input samples (treated independently)
Fields
dimension
kmax
cin
cout
σ
init_weight
source
',7))]),t("details",C1,[t("summary",null,[e[149]||(e[149]=t("a",{id:"NeuralClosure.fno-Tuple{}",href:"#NeuralClosure.fno-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.fno")],-1)),e[150]||(e[150]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[151]||(e[151]=a('julia fno (; setup, kmax, c, σ, ψ, rng, kwargs ... )
Create FNO closure model. Return a tuple (closure, θ)
where θ
are the initial parameters and closure(V, θ)
predicts the commutator error.
source
',3))]),e[175]||(e[175]=t("h2",{id:"Data-generation",tabindex:"-1"},[s("Data generation "),t("a",{class:"header-anchor",href:"#Data-generation","aria-label":'Permalink to "Data generation {#Data-generation}"'},"")],-1)),t("details",M1,[t("summary",null,[e[152]||(e[152]=t("a",{id:"NeuralClosure.create_io_arrays-Tuple{Any, Any}",href:"#NeuralClosure.create_io_arrays-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_io_arrays")],-1)),e[153]||(e[153]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[158]||(e[158]=a('julia create_io_arrays (data, setup) -> NamedTuple
',1)),t("p",null,[e[156]||(e[156]=s("Create ")),t("mjx-container",L1,[(o(),n("svg",V1,e[154]||(e[154]=[a(' ',1)]))),e[155]||(e[155]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"("),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"u"),t("mo",{stretchy:"false"},"¯")])]),t("mo",null,","),t("mi",null,"c"),t("mo",{stretchy:"false"},")")])],-1))]),e[157]||(e[157]=s(" pairs for a-priori training."))]),e[159]||(e[159]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/lib/NeuralClosure/src/data_generation.jl#L228",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",N1,[t("summary",null,[e[160]||(e[160]=t("a",{id:"NeuralClosure.create_les_data-Tuple{}",href:"#NeuralClosure.create_les_data-Tuple{}"},[t("span",{class:"jlbinding"},"NeuralClosure.create_les_data")],-1)),e[161]||(e[161]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[162]||(e[162]=a(`julia create_les_data (
+;
+ D,
+ Re,
+ lims,
+ nles,
+ ndns,
+ filters,
+ tburn,
+ tsim,
+ savefreq,
+ Δt,
+ method,
+ create_psolver,
+ backend,
+ icfunc,
+ processors,
+ rng,
+ filenames,
+ kwargs ...
+)
Create filtered DNS data.
source
`,3))]),t("details",Z1,[t("summary",null,[e[163]||(e[163]=t("a",{id:"NeuralClosure.filtersaver-NTuple{6, Any}",href:"#NeuralClosure.filtersaver-NTuple{6, Any}"},[t("span",{class:"jlbinding"},"NeuralClosure.filtersaver")],-1)),e[164]||(e[164]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[165]||(e[165]=a(`julia filtersaver (
+ dns,
+ les,
+ filters,
+ compression,
+ psolver_dns,
+ psolver_les;
+ nupdate,
+ filenames,
+ F,
+ p
+)
Save filtered DNS data.
source
`,3))])])}const z1=r(T,[["render",D1]]);export{I1 as __pageData,z1 as default};
diff --git a/previews/PR126/assets/manual_differentiability.md.Do-3poq7.js b/previews/PR126/assets/manual_differentiability.md.Do-3poq7.js
new file mode 100644
index 00000000..0c0ac00f
--- /dev/null
+++ b/previews/PR126/assets/manual_differentiability.md.Do-3poq7.js
@@ -0,0 +1,93 @@
+import{_ as p,c as n,a5 as e,j as i,a,o as t}from"./chunks/framework.BSoZtefh.js";const u=JSON.parse('{"title":"Differentiating through the code","description":"","frontmatter":{},"headers":[],"relativePath":"manual/differentiability.md","filePath":"manual/differentiability.md","lastUpdated":null}'),l={name:"manual/differentiability.md"},h={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"};function r(d,s,o,g,c,E){return t(),n("div",null,[s[10]||(s[10]=e(`Differentiating through the code IncompressibleNavierStokes is reverse-mode differentiable , which means that you can back-propagate gradients through the code. Two AD libraries are currently supported:
Zygote.jl : it is the default AD library in the Julia ecosystem and is the most widely used.
Enzyme.jl : currently has low coverage over the Julia programming language, however it is usually the most efficient if applicable.
Automatic differentiation with Zygote Zygote.jl is the default choice for AD backend because it is easy to understand, compatible with most of the Julia ecosystem and good with vectorized code and BLAS. This comes at a cost however, as intermediate velocity fields need to be stored in memory for use in the backward pass. For this reason, many of the operators come in two versions: a slow differentiable allocating non-mutating variant (e.g. divergence
) and fast non-differentiable non-allocating mutating variant (e.g. divergence!
.)
Zygote limitation: array mutation
To make your code differentiable, you must use the differentiable versions of the operators (without the exclamation marks).
Example: Gradient of kinetic energy To differentiate outputs of a simulation with respect to the initial conditions, make a time stepping loop composed of differentiable operations:
julia using IncompressibleNavierStokes
+
+ax = range ( 0 , 1 , 101 )
+setup = Setup (; x = (ax, ax), Re = 500.0 )
+psolver = default_psolver (setup)
+method = RKMethods . RK44P2 ()
+Δt = 0.01
+nstep = 100
+(; Iu) = setup . grid
+function final_energy (u)
+ stepper = create_stepper (method; setup, psolver, u, temp = nothing , t = 0.0 )
+ for it = 1 : nstep
+ stepper = timestep (method, stepper, Δt)
+ end
+ (; u) = stepper
+ sum (abs2, u[Iu[ 1 ], 1 ]) / 2 + sum (abs2, u[Iu[ 2 ], 2 ]) / 2
+end
+
+u = random_field (setup)
+
+using Zygote
+g, = Zygote . gradient (final_energy, u)
+
+@show size (u) size (g)
Now g
is the gradient of final_energy
with respect to the initial conditions u
, and consequently has the same size.
Note that every operation in the final_energy
function is non-mutating and thus differentiable.
Automatic differentiation with Enzyme Enzyme.jl is highly-efficient and its ability to perform AD on optimized code allows Enzyme to meet or exceed the performance of state-of-the-art AD tools. The downside is that restricts the user's defined f function to not do things like require garbage collection or calls to BLAS/LAPACK. However, mutation is supported, meaning that in-place f with fully mutating non-allocating code will work with Enzyme and this will be the most efficient adjoint implementation.
Enzyme limitation: vector returns
Enzyme's autodiff function can only handle functions with scalar output. To implement pullbacks for array-valued functions, use a mutating function that returns nothing
and stores its result in one of the arguments, which must be passed wrapped in a Duplicated. In IncompressibleNavierStokes, we provide enzyme_wrapper
to automatically wrap the function and its arguments in the correct way.
Example: Gradient of the right-hand side In this example we differentiate the right-hand side of the Navier-Stokes equations with respect to the velocity field u
:
julia using Enzyme
+ax = range ( 0 , 1 , 101 )
+setup = Setup (; x = (ax, ax), Re = 500.0 )
+psolver = default_psolver (setup)
+u = random_field (setup)
+dudt = similar (u)
+t = 0.0
+f! = right_hand_side!
right_hand_side! (generic function with 1 method)
Notice that we are using the mutating (in-place) version of the right-hand side function. This function can not be differentiate by Zygote, which requires the slower non-mutating version of the right-hand side.
We then define the Dual
part of the input and output, required to store the adjoint values:
julia ddudt = Enzyme . make_zero (dudt) .+ 1 ;
+du = Enzyme . make_zero (u);
102×102×2 Array{Float64, 3}:
+[:, :, 1] =
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ ⋮ ⋮ ⋱ ⋮ ⋮
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+
+[:, :, 2] =
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ ⋮ ⋮ ⋱ ⋮ ⋮
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
`,23)),i("p",null,[s[2]||(s[2]=a("Remember that the derivative of the output (also called the ")),s[3]||(s[3]=i("em",null,"seed",-1)),s[4]||(s[4]=a(") has to be set to ")),i("mjx-container",h,[(t(),n("svg",k,s[0]||(s[0]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mn"},[i("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mn",null,"1")])],-1))]),s[5]||(s[5]=a(" in order to compute the gradient. In this case the output is the force, that we store mutating the value of ")),s[6]||(s[6]=i("code",null,"dudt",-1)),s[7]||(s[7]=a(" inside ")),s[8]||(s[8]=i("code",null,"right_hand_side!",-1)),s[9]||(s[9]=a("."))]),s[11]||(s[11]=e(`Then we pack the parameters to be passed to right_hand_side!
:
julia params = [setup, psolver];
+params_ref = Ref (params);
Base.RefValue{Vector{Any}}(Any[(grid = (xlims = ((0.0, 1.0), (0.0, 1.0)), dimension = IncompressibleNavierStokes.Dimension{2}(), N = (102, 102), Nu = ((100, 100), (100, 100)), Np = (100, 100), Iu = (CartesianIndices((2:101, 2:101)), CartesianIndices((2:101, 2:101))), Ip = CartesianIndices((2:101, 2:101)), x = ([-0.010000000000000009, 0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08 … 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.0, 1.01], [-0.010000000000000009, 0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08 … 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.0, 1.01]), xu = (([0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09 … 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.0, 1.01], [-0.0050000000000000044, 0.005, 0.015, 0.025, 0.035, 0.045, 0.055, 0.065, 0.07500000000000001, 0.08499999999999999 … 0.915, 0.925, 0.935, 0.945, 0.955, 0.965, 0.975, 0.985, 0.995, 1.005]), ([-0.0050000000000000044, 0.005, 0.015, 0.025, 0.035, 0.045, 0.055, 0.065, 0.07500000000000001, 0.08499999999999999 … 0.915, 0.925, 0.935, 0.945, 0.955, 0.965, 0.975, 0.985, 0.995, 1.005], [0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09 … 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.0, 1.01])), xp = ([-0.0050000000000000044, 0.005, 0.015, 0.025, 0.035, 0.045, 0.055, 0.065, 0.07500000000000001, 0.08499999999999999 … 0.915, 0.925, 0.935, 0.945, 0.955, 0.965, 0.975, 0.985, 0.995, 1.005], [-0.0050000000000000044, 0.005, 0.015, 0.025, 0.035, 0.045, 0.055, 0.065, 0.07500000000000001, 0.08499999999999999 … 0.915, 0.925, 0.935, 0.945, 0.955, 0.965, 0.975, 0.985, 0.995, 1.005]), Δ = ([0.010000000000000009, 0.01, 0.01, 0.009999999999999998, 0.010000000000000002, 0.010000000000000002, 0.009999999999999995, 0.010000000000000009, 0.009999999999999995, 0.009999999999999995 … 0.010000000000000009, 0.010000000000000009, 0.009999999999999898, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009], [0.010000000000000009, 0.01, 0.01, 0.009999999999999998, 0.010000000000000002, 0.010000000000000002, 0.009999999999999995, 0.010000000000000009, 0.009999999999999995, 0.009999999999999995 … 0.010000000000000009, 0.010000000000000009, 0.009999999999999898, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009]), Δu = ([0.010000000000000005, 0.009999999999999998, 0.010000000000000002, 0.010000000000000002, 0.009999999999999995, 0.010000000000000002, 0.010000000000000002, 0.010000000000000009, 0.009999999999999981, 0.010000000000000009 … 0.010000000000000009, 0.010000000000000009, 0.009999999999999898, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.009999999999999898, 0.0050000000000000044], [0.010000000000000005, 0.009999999999999998, 0.010000000000000002, 0.010000000000000002, 0.009999999999999995, 0.010000000000000002, 0.010000000000000002, 0.010000000000000009, 0.009999999999999981, 0.010000000000000009 … 0.010000000000000009, 0.010000000000000009, 0.009999999999999898, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.009999999999999898, 0.0050000000000000044]), A = ((([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), ([1.0, 0.4999999999999998, 0.4999999999999999, 0.5, 0.5000000000000003, 0.5, 0.49999999999999967, 0.5000000000000003, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5000000000000056, 0.5, 0.5, 0.5, 0.5, 0.5, 0.49999999999999445], [0.5000000000000002, 0.5000000000000001, 0.5, 0.49999999999999967, 0.5, 0.5000000000000003, 0.49999999999999967, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.49999999999999445, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5000000000000056, 1.0])), (([1.0, 0.4999999999999998, 0.4999999999999999, 0.5, 0.5000000000000003, 0.5, 0.49999999999999967, 0.5000000000000003, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5000000000000056, 0.5, 0.5, 0.5, 0.5, 0.5, 0.49999999999999445], [0.5000000000000002, 0.5000000000000001, 0.5, 0.49999999999999967, 0.5, 0.5000000000000003, 0.49999999999999967, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.49999999999999445, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5000000000000056, 1.0]), ([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])))), boundary_conditions = ((PeriodicBC(), PeriodicBC()), (PeriodicBC(), PeriodicBC())), Re = 500.0, bodyforce = nothing, issteadybodyforce = false, closure_model = nothing, backend = CPU(false), workgroupsize = 64, temperature = nothing), IncompressibleNavierStokes.var"#psolve!#124"{FFTW.rFFTWPlan{Float64, -1, false, 2, Tuple{Int64, Int64}}, Matrix{Float64}, Matrix{ComplexF64}, Int64, CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}}(FFTW real-to-complex plan for 100×100 array of Float64
+(rdft2-rank>=2/1
+ (rdft2-vrank>=1-x100/1
+ (rdft2-ct-dit/20
+ (hc2c-direct-20/76/0 "hc2cfdftv_20_avx2"
+ (rdft2-ct-dit/2
+ (hc2c-direct-2/4/0 "hc2cfdftv_2_avx2"
+ (rdft2-r2hc-direct-2 "r2cf_2")
+ (rdft2-r2hc01-direct-2 "r2cfII_2"))
+ (dft-direct-10 "n1fv_10_avx2_128"))
+ (rdft2-nop))
+ (dft-direct-5-x10 "n1fv_5_avx2_128")))
+ (dft-vrank>=1-x51/1
+ (dft-ct-dit/10
+ (dftw-direct-10/6 "t3fv_10_avx2_128")
+ (dft-directbuf/14-10-x10 "n1fv_10_avx2")))), [6.91365635410076e-310 6.9136563563142e-310 … 1.265e-321 1.75e-321; 6.9136563541229e-310 6.9136563563363e-310 … 1.265e-321 1.764e-321; … ; 6.9136563562699e-310 6.9136563584833e-310 … 1.75e-321 2.233e-321; 6.91365635629204e-310 6.91365635850546e-310 … 1.75e-321 2.25e-321], ComplexF64[0.0 + 0.0im 6.986129655e-315 + 1.27319747483e-313im … 0.0 + 0.0im 0.0 + 0.0im; 1.443e-321 + 6.98612574e-315im -9.605593679422648e85 + 1.63e-322im … 0.0 + 0.0im 1.443e-321 + 6.98652487e-315im; … ; 1.966162503567101e-236 + 1.24823282e-315im 1.443e-321 + 6.98613357e-315im … 0.0 + 0.0im 6.986528623e-315 + 8.487983164e-314im; 0.0 + 1.443e-321im 1.27319747483e-313 + 0.0im … 0.0 + 0.0im 0.0 + 0.0im], Core.Box(([0.0, 0.003946543143456876, 0.01577059737104434, 0.035425498542622634, 0.06283367774273778, 0.09788696740969285, 0.1404470282234972, 0.19034589506796099, 0.24738663991227286, 0.3113441489959698 … 3.68865585100403, 3.752613360087727, 3.809654104932039, 3.859552971776503, 3.9021130325903073, 3.9371663222572626, 3.9645745014573777, 3.984229402628956, 3.996053456856544, 4.0], [0.0, 0.003946543143456876, 0.01577059737104434, 0.035425498542622634, 0.06283367774273778, 0.09788696740969285, 0.1404470282234972, 0.19034589506796099, 0.24738663991227286, 0.3113441489959698 … 0.3819660112501049, 0.3113441489959696, 0.24738663991227255, 0.19034589506796068, 0.14044702822349744, 0.09788696740969302, 0.06283367774273789, 0.0354254985426227, 0.015770597371044366, 0.003946543143456883])), 2, CartesianIndices((2:101, 2:101)))])
Now, we call the autodiff
function from Enzyme:
julia Enzyme . autodiff (Enzyme . Reverse, f!, Duplicated (dudt,ddudt), Duplicated (u,du), Const (params_ref), Const (t))
((nothing, nothing, nothing, nothing),)
Since we have passed a Duplicated
object, the gradient of u
is stored in du
.
Finally, we can also compare its value with the one obtained by Zygote differentiating the out-of-place (non-mutating) version of the right-hand side:
julia f = create_right_hand_side (setup, psolver)
+_, zpull = Zygote . pullback (f, u, nothing , 0.0 );
+@assert zpull (dudt)[ 1 ] == du
`,9))])}const m=p(l,[["render",r]]);export{u as __pageData,m as default};
diff --git a/previews/PR126/assets/manual_differentiability.md.Do-3poq7.lean.js b/previews/PR126/assets/manual_differentiability.md.Do-3poq7.lean.js
new file mode 100644
index 00000000..0c0ac00f
--- /dev/null
+++ b/previews/PR126/assets/manual_differentiability.md.Do-3poq7.lean.js
@@ -0,0 +1,93 @@
+import{_ as p,c as n,a5 as e,j as i,a,o as t}from"./chunks/framework.BSoZtefh.js";const u=JSON.parse('{"title":"Differentiating through the code","description":"","frontmatter":{},"headers":[],"relativePath":"manual/differentiability.md","filePath":"manual/differentiability.md","lastUpdated":null}'),l={name:"manual/differentiability.md"},h={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"};function r(d,s,o,g,c,E){return t(),n("div",null,[s[10]||(s[10]=e(`Differentiating through the code IncompressibleNavierStokes is reverse-mode differentiable , which means that you can back-propagate gradients through the code. Two AD libraries are currently supported:
Zygote.jl : it is the default AD library in the Julia ecosystem and is the most widely used.
Enzyme.jl : currently has low coverage over the Julia programming language, however it is usually the most efficient if applicable.
Automatic differentiation with Zygote Zygote.jl is the default choice for AD backend because it is easy to understand, compatible with most of the Julia ecosystem and good with vectorized code and BLAS. This comes at a cost however, as intermediate velocity fields need to be stored in memory for use in the backward pass. For this reason, many of the operators come in two versions: a slow differentiable allocating non-mutating variant (e.g. divergence
) and fast non-differentiable non-allocating mutating variant (e.g. divergence!
.)
Zygote limitation: array mutation
To make your code differentiable, you must use the differentiable versions of the operators (without the exclamation marks).
Example: Gradient of kinetic energy To differentiate outputs of a simulation with respect to the initial conditions, make a time stepping loop composed of differentiable operations:
julia using IncompressibleNavierStokes
+
+ax = range ( 0 , 1 , 101 )
+setup = Setup (; x = (ax, ax), Re = 500.0 )
+psolver = default_psolver (setup)
+method = RKMethods . RK44P2 ()
+Δt = 0.01
+nstep = 100
+(; Iu) = setup . grid
+function final_energy (u)
+ stepper = create_stepper (method; setup, psolver, u, temp = nothing , t = 0.0 )
+ for it = 1 : nstep
+ stepper = timestep (method, stepper, Δt)
+ end
+ (; u) = stepper
+ sum (abs2, u[Iu[ 1 ], 1 ]) / 2 + sum (abs2, u[Iu[ 2 ], 2 ]) / 2
+end
+
+u = random_field (setup)
+
+using Zygote
+g, = Zygote . gradient (final_energy, u)
+
+@show size (u) size (g)
Now g
is the gradient of final_energy
with respect to the initial conditions u
, and consequently has the same size.
Note that every operation in the final_energy
function is non-mutating and thus differentiable.
Automatic differentiation with Enzyme Enzyme.jl is highly-efficient and its ability to perform AD on optimized code allows Enzyme to meet or exceed the performance of state-of-the-art AD tools. The downside is that restricts the user's defined f function to not do things like require garbage collection or calls to BLAS/LAPACK. However, mutation is supported, meaning that in-place f with fully mutating non-allocating code will work with Enzyme and this will be the most efficient adjoint implementation.
Enzyme limitation: vector returns
Enzyme's autodiff function can only handle functions with scalar output. To implement pullbacks for array-valued functions, use a mutating function that returns nothing
and stores its result in one of the arguments, which must be passed wrapped in a Duplicated. In IncompressibleNavierStokes, we provide enzyme_wrapper
to automatically wrap the function and its arguments in the correct way.
Example: Gradient of the right-hand side In this example we differentiate the right-hand side of the Navier-Stokes equations with respect to the velocity field u
:
julia using Enzyme
+ax = range ( 0 , 1 , 101 )
+setup = Setup (; x = (ax, ax), Re = 500.0 )
+psolver = default_psolver (setup)
+u = random_field (setup)
+dudt = similar (u)
+t = 0.0
+f! = right_hand_side!
right_hand_side! (generic function with 1 method)
Notice that we are using the mutating (in-place) version of the right-hand side function. This function can not be differentiate by Zygote, which requires the slower non-mutating version of the right-hand side.
We then define the Dual
part of the input and output, required to store the adjoint values:
julia ddudt = Enzyme . make_zero (dudt) .+ 1 ;
+du = Enzyme . make_zero (u);
102×102×2 Array{Float64, 3}:
+[:, :, 1] =
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ ⋮ ⋮ ⋱ ⋮ ⋮
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+
+[:, :, 2] =
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ ⋮ ⋮ ⋱ ⋮ ⋮
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
`,23)),i("p",null,[s[2]||(s[2]=a("Remember that the derivative of the output (also called the ")),s[3]||(s[3]=i("em",null,"seed",-1)),s[4]||(s[4]=a(") has to be set to ")),i("mjx-container",h,[(t(),n("svg",k,s[0]||(s[0]=[i("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[i("g",{"data-mml-node":"math"},[i("g",{"data-mml-node":"mn"},[i("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1)]))),s[1]||(s[1]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mn",null,"1")])],-1))]),s[5]||(s[5]=a(" in order to compute the gradient. In this case the output is the force, that we store mutating the value of ")),s[6]||(s[6]=i("code",null,"dudt",-1)),s[7]||(s[7]=a(" inside ")),s[8]||(s[8]=i("code",null,"right_hand_side!",-1)),s[9]||(s[9]=a("."))]),s[11]||(s[11]=e(`Then we pack the parameters to be passed to right_hand_side!
:
julia params = [setup, psolver];
+params_ref = Ref (params);
Base.RefValue{Vector{Any}}(Any[(grid = (xlims = ((0.0, 1.0), (0.0, 1.0)), dimension = IncompressibleNavierStokes.Dimension{2}(), N = (102, 102), Nu = ((100, 100), (100, 100)), Np = (100, 100), Iu = (CartesianIndices((2:101, 2:101)), CartesianIndices((2:101, 2:101))), Ip = CartesianIndices((2:101, 2:101)), x = ([-0.010000000000000009, 0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08 … 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.0, 1.01], [-0.010000000000000009, 0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08 … 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.0, 1.01]), xu = (([0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09 … 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.0, 1.01], [-0.0050000000000000044, 0.005, 0.015, 0.025, 0.035, 0.045, 0.055, 0.065, 0.07500000000000001, 0.08499999999999999 … 0.915, 0.925, 0.935, 0.945, 0.955, 0.965, 0.975, 0.985, 0.995, 1.005]), ([-0.0050000000000000044, 0.005, 0.015, 0.025, 0.035, 0.045, 0.055, 0.065, 0.07500000000000001, 0.08499999999999999 … 0.915, 0.925, 0.935, 0.945, 0.955, 0.965, 0.975, 0.985, 0.995, 1.005], [0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09 … 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.0, 1.01])), xp = ([-0.0050000000000000044, 0.005, 0.015, 0.025, 0.035, 0.045, 0.055, 0.065, 0.07500000000000001, 0.08499999999999999 … 0.915, 0.925, 0.935, 0.945, 0.955, 0.965, 0.975, 0.985, 0.995, 1.005], [-0.0050000000000000044, 0.005, 0.015, 0.025, 0.035, 0.045, 0.055, 0.065, 0.07500000000000001, 0.08499999999999999 … 0.915, 0.925, 0.935, 0.945, 0.955, 0.965, 0.975, 0.985, 0.995, 1.005]), Δ = ([0.010000000000000009, 0.01, 0.01, 0.009999999999999998, 0.010000000000000002, 0.010000000000000002, 0.009999999999999995, 0.010000000000000009, 0.009999999999999995, 0.009999999999999995 … 0.010000000000000009, 0.010000000000000009, 0.009999999999999898, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009], [0.010000000000000009, 0.01, 0.01, 0.009999999999999998, 0.010000000000000002, 0.010000000000000002, 0.009999999999999995, 0.010000000000000009, 0.009999999999999995, 0.009999999999999995 … 0.010000000000000009, 0.010000000000000009, 0.009999999999999898, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009]), Δu = ([0.010000000000000005, 0.009999999999999998, 0.010000000000000002, 0.010000000000000002, 0.009999999999999995, 0.010000000000000002, 0.010000000000000002, 0.010000000000000009, 0.009999999999999981, 0.010000000000000009 … 0.010000000000000009, 0.010000000000000009, 0.009999999999999898, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.009999999999999898, 0.0050000000000000044], [0.010000000000000005, 0.009999999999999998, 0.010000000000000002, 0.010000000000000002, 0.009999999999999995, 0.010000000000000002, 0.010000000000000002, 0.010000000000000009, 0.009999999999999981, 0.010000000000000009 … 0.010000000000000009, 0.010000000000000009, 0.009999999999999898, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.010000000000000009, 0.009999999999999898, 0.0050000000000000044]), A = ((([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), ([1.0, 0.4999999999999998, 0.4999999999999999, 0.5, 0.5000000000000003, 0.5, 0.49999999999999967, 0.5000000000000003, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5000000000000056, 0.5, 0.5, 0.5, 0.5, 0.5, 0.49999999999999445], [0.5000000000000002, 0.5000000000000001, 0.5, 0.49999999999999967, 0.5, 0.5000000000000003, 0.49999999999999967, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.49999999999999445, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5000000000000056, 1.0])), (([1.0, 0.4999999999999998, 0.4999999999999999, 0.5, 0.5000000000000003, 0.5, 0.49999999999999967, 0.5000000000000003, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5000000000000056, 0.5, 0.5, 0.5, 0.5, 0.5, 0.49999999999999445], [0.5000000000000002, 0.5000000000000001, 0.5, 0.49999999999999967, 0.5, 0.5000000000000003, 0.49999999999999967, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.49999999999999445, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5000000000000056, 1.0]), ([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 … 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])))), boundary_conditions = ((PeriodicBC(), PeriodicBC()), (PeriodicBC(), PeriodicBC())), Re = 500.0, bodyforce = nothing, issteadybodyforce = false, closure_model = nothing, backend = CPU(false), workgroupsize = 64, temperature = nothing), IncompressibleNavierStokes.var"#psolve!#124"{FFTW.rFFTWPlan{Float64, -1, false, 2, Tuple{Int64, Int64}}, Matrix{Float64}, Matrix{ComplexF64}, Int64, CartesianIndices{2, Tuple{UnitRange{Int64}, UnitRange{Int64}}}}(FFTW real-to-complex plan for 100×100 array of Float64
+(rdft2-rank>=2/1
+ (rdft2-vrank>=1-x100/1
+ (rdft2-ct-dit/20
+ (hc2c-direct-20/76/0 "hc2cfdftv_20_avx2"
+ (rdft2-ct-dit/2
+ (hc2c-direct-2/4/0 "hc2cfdftv_2_avx2"
+ (rdft2-r2hc-direct-2 "r2cf_2")
+ (rdft2-r2hc01-direct-2 "r2cfII_2"))
+ (dft-direct-10 "n1fv_10_avx2_128"))
+ (rdft2-nop))
+ (dft-direct-5-x10 "n1fv_5_avx2_128")))
+ (dft-vrank>=1-x51/1
+ (dft-ct-dit/10
+ (dftw-direct-10/6 "t3fv_10_avx2_128")
+ (dft-directbuf/14-10-x10 "n1fv_10_avx2")))), [6.91365635410076e-310 6.9136563563142e-310 … 1.265e-321 1.75e-321; 6.9136563541229e-310 6.9136563563363e-310 … 1.265e-321 1.764e-321; … ; 6.9136563562699e-310 6.9136563584833e-310 … 1.75e-321 2.233e-321; 6.91365635629204e-310 6.91365635850546e-310 … 1.75e-321 2.25e-321], ComplexF64[0.0 + 0.0im 6.986129655e-315 + 1.27319747483e-313im … 0.0 + 0.0im 0.0 + 0.0im; 1.443e-321 + 6.98612574e-315im -9.605593679422648e85 + 1.63e-322im … 0.0 + 0.0im 1.443e-321 + 6.98652487e-315im; … ; 1.966162503567101e-236 + 1.24823282e-315im 1.443e-321 + 6.98613357e-315im … 0.0 + 0.0im 6.986528623e-315 + 8.487983164e-314im; 0.0 + 1.443e-321im 1.27319747483e-313 + 0.0im … 0.0 + 0.0im 0.0 + 0.0im], Core.Box(([0.0, 0.003946543143456876, 0.01577059737104434, 0.035425498542622634, 0.06283367774273778, 0.09788696740969285, 0.1404470282234972, 0.19034589506796099, 0.24738663991227286, 0.3113441489959698 … 3.68865585100403, 3.752613360087727, 3.809654104932039, 3.859552971776503, 3.9021130325903073, 3.9371663222572626, 3.9645745014573777, 3.984229402628956, 3.996053456856544, 4.0], [0.0, 0.003946543143456876, 0.01577059737104434, 0.035425498542622634, 0.06283367774273778, 0.09788696740969285, 0.1404470282234972, 0.19034589506796099, 0.24738663991227286, 0.3113441489959698 … 0.3819660112501049, 0.3113441489959696, 0.24738663991227255, 0.19034589506796068, 0.14044702822349744, 0.09788696740969302, 0.06283367774273789, 0.0354254985426227, 0.015770597371044366, 0.003946543143456883])), 2, CartesianIndices((2:101, 2:101)))])
Now, we call the autodiff
function from Enzyme:
julia Enzyme . autodiff (Enzyme . Reverse, f!, Duplicated (dudt,ddudt), Duplicated (u,du), Const (params_ref), Const (t))
((nothing, nothing, nothing, nothing),)
Since we have passed a Duplicated
object, the gradient of u
is stored in du
.
Finally, we can also compare its value with the one obtained by Zygote differentiating the out-of-place (non-mutating) version of the right-hand side:
julia f = create_right_hand_side (setup, psolver)
+_, zpull = Zygote . pullback (f, u, nothing , 0.0 );
+@assert zpull (dudt)[ 1 ] == du
`,9))])}const m=p(l,[["render",r]]);export{u as __pageData,m as default};
diff --git a/previews/PR126/assets/manual_gpu.md.DpR1QCQ8.js b/previews/PR126/assets/manual_gpu.md.DpR1QCQ8.js
new file mode 100644
index 00000000..639a4c0d
--- /dev/null
+++ b/previews/PR126/assets/manual_gpu.md.DpR1QCQ8.js
@@ -0,0 +1,2 @@
+import{_ as a,c as s,a5 as t,o as i}from"./chunks/framework.BSoZtefh.js";const c=JSON.parse('{"title":"GPU Support","description":"","frontmatter":{},"headers":[],"relativePath":"manual/gpu.md","filePath":"manual/gpu.md","lastUpdated":null}'),l={name:"manual/gpu.md"};function r(p,e,n,o,h,d){return i(),s("div",null,e[0]||(e[0]=[t(`GPU Support IncompressibleNavierStokes supports various array types. The desired backend only has to be passed to the Setup
function:
julia using CUDA
+setup = Setup (; kwargs ... , backend = CUDABackend ())
All operators have been made are backend agnostic by using KernelAbstractions.jl . Even if a GPU is not available, the operators are multithreaded if Julia is started with multiple threads (e.g. julia -t 4
)
This has been tested with CUDA compatible GPUs.
This has not been tested with other GPU interfaces, such as
If they start supporting sparse matrices and fast Fourier transforms they could also be used.
psolver_direct
on CUDA
To use a specialized linear solver for CUDA, make sure to install and using
CUDA.jl and CUDSS.jl. Then psolver_direct
will automatically use the CUDSS solver.
`,6)]))}const k=a(l,[["render",r]]);export{c as __pageData,k as default};
diff --git a/previews/PR126/assets/manual_gpu.md.DpR1QCQ8.lean.js b/previews/PR126/assets/manual_gpu.md.DpR1QCQ8.lean.js
new file mode 100644
index 00000000..639a4c0d
--- /dev/null
+++ b/previews/PR126/assets/manual_gpu.md.DpR1QCQ8.lean.js
@@ -0,0 +1,2 @@
+import{_ as a,c as s,a5 as t,o as i}from"./chunks/framework.BSoZtefh.js";const c=JSON.parse('{"title":"GPU Support","description":"","frontmatter":{},"headers":[],"relativePath":"manual/gpu.md","filePath":"manual/gpu.md","lastUpdated":null}'),l={name:"manual/gpu.md"};function r(p,e,n,o,h,d){return i(),s("div",null,e[0]||(e[0]=[t(`GPU Support IncompressibleNavierStokes supports various array types. The desired backend only has to be passed to the Setup
function:
julia using CUDA
+setup = Setup (; kwargs ... , backend = CUDABackend ())
All operators have been made are backend agnostic by using KernelAbstractions.jl . Even if a GPU is not available, the operators are multithreaded if Julia is started with multiple threads (e.g. julia -t 4
)
This has been tested with CUDA compatible GPUs.
This has not been tested with other GPU interfaces, such as
If they start supporting sparse matrices and fast Fourier transforms they could also be used.
psolver_direct
on CUDA
To use a specialized linear solver for CUDA, make sure to install and using
CUDA.jl and CUDSS.jl. Then psolver_direct
will automatically use the CUDSS solver.
`,6)]))}const k=a(l,[["render",r]]);export{c as __pageData,k as default};
diff --git a/previews/PR126/assets/manual_les.md.C92GZ80j.js b/previews/PR126/assets/manual_les.md.C92GZ80j.js
new file mode 100644
index 00000000..2212d9e8
--- /dev/null
+++ b/previews/PR126/assets/manual_les.md.C92GZ80j.js
@@ -0,0 +1 @@
+import{_ as t,c as s,a5 as o,o as a}from"./chunks/framework.BSoZtefh.js";const i="/IncompressibleNavierStokes.jl/previews/PR126/assets/resolution.DAYTxiG0.png",f=JSON.parse('{"title":"Large eddy simulation","description":"","frontmatter":{},"headers":[],"relativePath":"manual/les.md","filePath":"manual/les.md","lastUpdated":null}'),r={name:"manual/les.md"};function l(n,e,d,c,m,u){return a(),s("div",null,e[0]||(e[0]=[o('Large eddy simulation Depending on the problem specification, a given grid resolution may not be sufficient to resolve all spatial features of the flow. Consider the following example:
On the left, the grid spacing is too large to capt the smallest eddies in the flow. These eddies create sub-grid stresses that also affect the large scale features. The grid must be refined if we want to compute these stresses exactly.
On the right, the smallest spatial feature of the flow is fully resolved, and there are no sub-grid stresses. The equations can be solved without worrying about errors from unresolved features. This is known as Direct Numerical Simulation (DNS).
If refining the grid is too costly, a closure model can be used to predict the sub-grid stresses. The models only give an estimate for these stresses, and may need to be calibrated to the given problem. When used correctly, they can predict the evolution of the large fluid motions without computing the sub-grid motions themselves. This is known as Large Eddy Simulation (LES).
Eddy viscosity models add a local contribution to the global baseline viscosity. The baseline viscosity models transfer of energy from resolved to atomic scales. The new turbulent viscosity on the other hand, models energy transfer from resolved to unresolved scales. This non-constant field is computed from the local velocity field.
',7)]))}const p=t(r,[["render",l]]);export{f as __pageData,p as default};
diff --git a/previews/PR126/assets/manual_les.md.C92GZ80j.lean.js b/previews/PR126/assets/manual_les.md.C92GZ80j.lean.js
new file mode 100644
index 00000000..2212d9e8
--- /dev/null
+++ b/previews/PR126/assets/manual_les.md.C92GZ80j.lean.js
@@ -0,0 +1 @@
+import{_ as t,c as s,a5 as o,o as a}from"./chunks/framework.BSoZtefh.js";const i="/IncompressibleNavierStokes.jl/previews/PR126/assets/resolution.DAYTxiG0.png",f=JSON.parse('{"title":"Large eddy simulation","description":"","frontmatter":{},"headers":[],"relativePath":"manual/les.md","filePath":"manual/les.md","lastUpdated":null}'),r={name:"manual/les.md"};function l(n,e,d,c,m,u){return a(),s("div",null,e[0]||(e[0]=[o('Large eddy simulation Depending on the problem specification, a given grid resolution may not be sufficient to resolve all spatial features of the flow. Consider the following example:
On the left, the grid spacing is too large to capt the smallest eddies in the flow. These eddies create sub-grid stresses that also affect the large scale features. The grid must be refined if we want to compute these stresses exactly.
On the right, the smallest spatial feature of the flow is fully resolved, and there are no sub-grid stresses. The equations can be solved without worrying about errors from unresolved features. This is known as Direct Numerical Simulation (DNS).
If refining the grid is too costly, a closure model can be used to predict the sub-grid stresses. The models only give an estimate for these stresses, and may need to be calibrated to the given problem. When used correctly, they can predict the evolution of the large fluid motions without computing the sub-grid motions themselves. This is known as Large Eddy Simulation (LES).
Eddy viscosity models add a local contribution to the global baseline viscosity. The baseline viscosity models transfer of energy from resolved to atomic scales. The new turbulent viscosity on the other hand, models energy transfer from resolved to unresolved scales. This non-constant field is computed from the local velocity field.
',7)]))}const p=t(r,[["render",l]]);export{f as __pageData,p as default};
diff --git a/previews/PR126/assets/manual_matrices.md.CJA9PRBT.js b/previews/PR126/assets/manual_matrices.md.CJA9PRBT.js
new file mode 100644
index 00000000..a57d3d6b
--- /dev/null
+++ b/previews/PR126/assets/manual_matrices.md.CJA9PRBT.js
@@ -0,0 +1,119 @@
+import{_ as r,c as l,a5 as n,j as a,a as i,G as t,B as o,o as p}from"./chunks/framework.BSoZtefh.js";const L=JSON.parse('{"title":"Sparse matrices","description":"","frontmatter":{},"headers":[],"relativePath":"manual/matrices.md","filePath":"manual/matrices.md","lastUpdated":null}'),h={name:"manual/matrices.md"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.986ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2204 1000","aria-hidden":"true"},c={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.801ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2122 1000","aria-hidden":"true"},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.53ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 3328.4 1000","aria-hidden":"true"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.17ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4495.2 1000","aria-hidden":"true"},b={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""};function S(B,s,A,D,I,M){const e=o("Badge");return p(),l("div",null,[s[53]||(s[53]=n(`Sparse matrices In IncompressibleNavierStokes, all operators are implemented as matrix-free kernels. However, access to the underlying matrices can sometimes be useful, for example to precompute matrix factorizations. We therefore provide sparse matrix versions of some of the linear operators (see full list below ).
Example Consider a simple setup
julia using IncompressibleNavierStokes
+ax = range ( 0 , 1 , 17 );
+setup = Setup (; x = (ax, ax), Re = 1e3 );
(grid = (xlims = ((0.0, 1.0), (0.0, 1.0)), dimension = IncompressibleNavierStokes.Dimension{2}(), N = (18, 18), Nu = ((16, 16), (16, 16)), Np = (16, 16), Iu = (CartesianIndices((2:17, 2:17)), CartesianIndices((2:17, 2:17))), Ip = CartesianIndices((2:17, 2:17)), x = ([-0.0625, 0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0625], [-0.0625, 0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0625]), xu = (([0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0625], [-0.03125, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.03125]), ([-0.03125, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.03125], [0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0625])), xp = ([-0.03125, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.03125], [-0.03125, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.03125]), Δ = ([0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625], [0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625]), Δu = ([0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.03125], [0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.03125]), A = ((([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), ([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])), (([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), ([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])))), boundary_conditions = ((PeriodicBC(), PeriodicBC()), (PeriodicBC(), PeriodicBC())), Re = 1000.0, bodyforce = nothing, issteadybodyforce = false, closure_model = nothing, backend = CPU(false), workgroupsize = 64, temperature = nothing)
The matrices for the linear operators are named by appending _mat
to the function name, for example: divergence
, pressuregradient
, and diffusion
become divergence_mat
, pressuregradient_mat
, diffusion_mat
etc.
Let's assemble some matrices:
julia divergence_mat (setup)
324×648 SparseArrays.SparseMatrixCSC{Float64, Int64} with 1024 stored entries:
+⎡⠀⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣄⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎤
+⎢⠀⠈⠹⢄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠙⢤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣗⣄⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣕⣄⠀⠀⎥
+⎣⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠃⠑⠀⎦
julia pressuregradient_mat (setup)
648×324 SparseArrays.SparseMatrixCSC{Float64, Int64} with 1024 stored entries:
+⎡⠀⢤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎤
+⎢⠀⠀⠓⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠈⠓⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠓⠀⎥
+⎢⠀⢤⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠙⢿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠙⢿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠙⢿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢽⣦⡀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣦⡀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣦⡀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⢽⢦⡀⎥
+⎣⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⠙⎦
julia diffusion_mat (setup)
648×648 SparseArrays.SparseMatrixCSC{Float64, Int64} with 2560 stored entries:
+⎡⣄⣤⣠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎤
+⎢⠈⠻⢷⢗⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠈⠻⣿⣿⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠈⠛⣟⣽⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣵⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠛⠙⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣄⣤⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⢟⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣟⣽⣤⡀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠳⣿⣿⣦⡀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⢵⢷⣦⡀⎥
+⎣⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠋⠛⠙⎦
`,14)),a("p",null,[s[4]||(s[4]=i("Note the sparsity pattern with matrix concatenation of two scalar operators for operators acting on or producing vector fields. The ")),s[5]||(s[5]=a("code",null,"pressuregradient_mat",-1)),s[6]||(s[6]=i(" converts a scalar field to a vector field, and is thus the vertical concatenation of the matrices for ")),a("mjx-container",d,[(p(),l("svg",k,s[0]||(s[0]=[n(' ',1)]))),s[1]||(s[1]=a("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[a("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[a("mi",null,"∂"),a("mrow",{"data-mjx-texclass":"ORD"},[a("mo",null,"/")]),a("mi",null,"∂"),a("mi",null,"x")])],-1))]),s[7]||(s[7]=i(" and ")),a("mjx-container",c,[(p(),l("svg",g,s[2]||(s[2]=[n(' ',1)]))),s[3]||(s[3]=a("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[a("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[a("mi",null,"∂"),a("mrow",{"data-mjx-texclass":"ORD"},[a("mo",null,"/")]),a("mi",null,"∂"),a("mi",null,"y")])],-1))]),s[8]||(s[8]=i(", while the ")),s[9]||(s[9]=a("code",null,"divergence_mat",-1)),s[10]||(s[10]=i(" is a horizontal concatenation of two similar matrices. The periodic boundary conditions are not included in the operators above, and are implemented via their own matrix. The periodic extension is visible:"))]),s[54]||(s[54]=n(`648×648 SparseArrays.SparseMatrixCSC{Float64, Int64} with 648 stored entries:
+⎡⠀⢄⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠨⠻⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎤
+⎢⠀⠁⠱⢅⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠐⢑⢔⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠐⢑⢔⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠓⢄⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠕⢅⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠕⢅⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⢑⢔⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⢑⢔⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⣦⡂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠑⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢄⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠨⠻⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠕⢅⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠕⢅⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⢑⢔⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⢑⢔⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠑⢤⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠕⢅⠄⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠕⢅⠄⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⢑⢆⢀⠀⎥
+⎣⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣦⡂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠑⠀⎦
We can verify that the diffusion matrix gives the same results as the diffusion kernel (without viscosity):
julia using Random
+u = randn! ( vectorfield (setup))
+B = bc_u_mat (setup)
+D = diffusion_mat (setup)
+d_kernel = diffusion ( apply_bc_u (u, 0.0 , setup), setup; use_viscosity = false )
+d_matrix = reshape (D * B * u[:], size (u))
+maximum (abs, d_matrix - d_kernel)
`,5)),a("p",null,[s[15]||(s[15]=i("Matrices only work on flattened fields ")),s[16]||(s[16]=a("code",null,"u[:]",-1)),s[17]||(s[17]=i(", while the kernels work on ")),a("mjx-container",m,[(p(),l("svg",u,s[11]||(s[11]=[n(' ',1)]))),s[12]||(s[12]=a("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[a("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[a("mo",{stretchy:"false"},"("),a("mi",null,"D"),a("mo",null,"+"),a("mn",null,"1"),a("mo",{stretchy:"false"},")")])],-1))]),s[18]||(s[18]=i("-array-shaped fields for a dimension ")),a("mjx-container",E,[(p(),l("svg",y,s[13]||(s[13]=[n(' ',1)]))),s[14]||(s[14]=a("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[a("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[a("mi",null,"D"),a("mo",null,"∈"),a("mo",{fence:"false",stretchy:"false"},"{"),a("mn",null,"2"),a("mo",null,","),a("mn",null,"3"),a("mo",{fence:"false",stretchy:"false"},"}")])],-1))]),s[19]||(s[19]=i("."))]),s[55]||(s[55]=n(`Boundary conditions and matrices Matrices can only be used to represent boundary conditions that depend linearly on the input, such as periodic or Neumann boundary conditions. Non-zero Dirichlet boundary conditions need to be accounted for separately. Consider the following inflow-setup:
julia setup = Setup (;
+ x = (ax, ax),
+ boundary_conditions = (
+ ( DirichletBC (( 10.0 , 0.0 )), PressureBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ),
+)
(grid = (xlims = ((0.0, 1.0), (0.0, 1.0)), dimension = IncompressibleNavierStokes.Dimension{2}(), N = (18, 18), Nu = ((16, 16), (16, 15)), Np = (16, 16), Iu = (CartesianIndices((2:17, 2:17)), CartesianIndices((2:17, 2:16))), Ip = CartesianIndices((2:17, 2:17)), x = ([0.0, 0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0], [0.0, 0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0]), xu = (([0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0], [0.0, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.0]), ([0.0, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.0], [0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0])), xp = ([0.0, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.0], [0.0, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.0]), Δ = ([2.220446049250313e-16, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 2.220446049250313e-16], [2.220446049250313e-16, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 2.220446049250313e-16]), Δu = ([0.03125, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.03125, 2.220446049250313e-16], [0.03125, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.03125, 2.220446049250313e-16]), A = ((([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), ([1.0, 1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0], [0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0, 1.0])), (([1.0, 1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0], [0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0, 1.0]), ([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])))), boundary_conditions = ((DirichletBC{Tuple{Float64, Float64}}((10.0, 0.0)), PressureBC()), (DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing))), Re = 1000.0, bodyforce = nothing, issteadybodyforce = false, closure_model = nothing, backend = CPU(false), workgroupsize = 64, temperature = nothing)
We can assert that the kernel and matrix versions of the divergence give different results:
julia using Random
+u = randn! ( vectorfield (setup))
+B = bc_u_mat (setup)
+M = divergence_mat (setup)
+div_kernel = divergence ( apply_bc_u (u, 0.0 , setup), setup)
+div_matrix = reshape (M * B * u[:], size (div_kernel))
+maximum (abs, div_matrix - div_kernel)
The solution is to create a vector containing the boundary conditions. This is done by applying the BC kernel on an empty field:
julia uzero = zero (u)
+yu = apply_bc_u (uzero, 0.0 , setup)
+yM = divergence (yu, setup)
18×18 Matrix{Float64}:
+ 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0
+ 0.0 -160.0 -160.0 -160.0 -160.0 -160.0 -160.0 -160.0 -160.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
By adding yM
, we get the equality:
julia maximum (abs, (div_matrix + yM) - div_kernel)
API `,14)),a("details",b,[a("summary",null,[s[20]||(s[20]=a("a",{id:"IncompressibleNavierStokes.bc_p_mat",href:"#IncompressibleNavierStokes.bc_p_mat"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.bc_p_mat")],-1)),s[21]||(s[21]=i()),t(e,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[22]||(s[22]=a("p",null,[i("Matrix for applying boundary conditions to pressure fields "),a("code",null,"p"),i(".")],-1)),s[23]||(s[23]=a("p",null,[a("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/matrices.jl#L61",target:"_blank",rel:"noreferrer"},"source")],-1))]),a("details",T,[a("summary",null,[s[24]||(s[24]=a("a",{id:"IncompressibleNavierStokes.bc_temp_mat",href:"#IncompressibleNavierStokes.bc_temp_mat"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.bc_temp_mat")],-1)),s[25]||(s[25]=i()),t(e,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=a("p",null,[i("Matrix for applying boundary conditions to temperature fields "),a("code",null,"temp"),i(".")],-1)),s[27]||(s[27]=a("p",null,[a("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/matrices.jl#L64",target:"_blank",rel:"noreferrer"},"source")],-1))]),a("details",Q,[a("summary",null,[s[28]||(s[28]=a("a",{id:"IncompressibleNavierStokes.bc_u_mat",href:"#IncompressibleNavierStokes.bc_u_mat"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.bc_u_mat")],-1)),s[29]||(s[29]=i()),t(e,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[30]||(s[30]=a("p",null,[i("Create matrix for applying boundary conditions to velocity fields "),a("code",null,"u"),i(". This matrix only applies the boundary conditions depending on "),a("code",null,"u"),i(" itself (e.g. "),a("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/manual/setup#IncompressibleNavierStokes.PeriodicBC"},[a("code",null,"PeriodicBC")]),i("). It does not apply constant boundary conditions (e.g. non-zero "),a("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/manual/setup#IncompressibleNavierStokes.DirichletBC"},[a("code",null,"DirichletBC")]),i(").")],-1)),s[31]||(s[31]=a("p",null,[a("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/matrices.jl#L54",target:"_blank",rel:"noreferrer"},"source")],-1))]),a("details",v,[a("summary",null,[s[32]||(s[32]=a("a",{id:"IncompressibleNavierStokes.diffusion_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.diffusion_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.diffusion_mat")],-1)),s[33]||(s[33]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[34]||(s[34]=n(`julia diffusion_mat (
+ setup
+) -> SparseArrays . SparseMatrixCSC{Tv, Int64} where Tv
Diffusion matrix.
source
`,3))]),a("details",f,[a("summary",null,[s[35]||(s[35]=a("a",{id:"IncompressibleNavierStokes.divergence_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.divergence_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.divergence_mat")],-1)),s[36]||(s[36]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[37]||(s[37]=n(`julia divergence_mat (
+ setup
+) -> SparseArrays . SparseMatrixCSC{Tv, Int64} where Tv
Divergence matrix.
source
`,3))]),a("details",C,[a("summary",null,[s[38]||(s[38]=a("a",{id:"IncompressibleNavierStokes.laplacian_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.laplacian_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.laplacian_mat")],-1)),s[39]||(s[39]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[40]||(s[40]=n('julia laplacian_mat (setup) -> Any
Get matrix for the Laplacian operator (for the pressure-Poisson equation). This matrix takes scalar field inputs restricted to the actual degrees of freedom.
source
',3))]),a("details",x,[a("summary",null,[s[41]||(s[41]=a("a",{id:"IncompressibleNavierStokes.pad_scalarfield_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.pad_scalarfield_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.pad_scalarfield_mat")],-1)),s[42]||(s[42]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[43]||(s[43]=n('julia pad_scalarfield_mat (setup) -> Any
Create matrix for padding inner scalar field with boundary volumes. This can be useful for algorithms that require vectors with degrees of freedom only, and not the ghost volumes. To go back, simply transpose the matrix.
See also: pad_vectorfield_mat
.
source
',4))]),a("details",F,[a("summary",null,[s[44]||(s[44]=a("a",{id:"IncompressibleNavierStokes.pad_vectorfield_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.pad_vectorfield_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.pad_vectorfield_mat")],-1)),s[45]||(s[45]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[46]||(s[46]=n(`julia pad_vectorfield_mat (
+ setup
+) -> SparseArrays . SparseMatrixCSC{Tv, Int64} where Tv
Create matrix for padding inner vector field with boundary volumes, similar to pad_scalarfield_mat
.
source
`,3))]),a("details",j,[a("summary",null,[s[47]||(s[47]=a("a",{id:"IncompressibleNavierStokes.pressuregradient_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.pressuregradient_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.pressuregradient_mat")],-1)),s[48]||(s[48]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[49]||(s[49]=n(`julia pressuregradient_mat (
+ setup
+) -> SparseArrays . SparseMatrixCSC{Tv, Int64} where Tv
Pressure gradient matrix.
source
`,3))]),a("details",w,[a("summary",null,[s[50]||(s[50]=a("a",{id:"IncompressibleNavierStokes.volume_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.volume_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.volume_mat")],-1)),s[51]||(s[51]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[52]||(s[52]=n('julia volume_mat (setup) -> Any
Volume-size matrix.
source
',3))])])}const _=r(h,[["render",S]]);export{L as __pageData,_ as default};
diff --git a/previews/PR126/assets/manual_matrices.md.CJA9PRBT.lean.js b/previews/PR126/assets/manual_matrices.md.CJA9PRBT.lean.js
new file mode 100644
index 00000000..a57d3d6b
--- /dev/null
+++ b/previews/PR126/assets/manual_matrices.md.CJA9PRBT.lean.js
@@ -0,0 +1,119 @@
+import{_ as r,c as l,a5 as n,j as a,a as i,G as t,B as o,o as p}from"./chunks/framework.BSoZtefh.js";const L=JSON.parse('{"title":"Sparse matrices","description":"","frontmatter":{},"headers":[],"relativePath":"manual/matrices.md","filePath":"manual/matrices.md","lastUpdated":null}'),h={name:"manual/matrices.md"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.986ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2204 1000","aria-hidden":"true"},c={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.801ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2122 1000","aria-hidden":"true"},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.53ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 3328.4 1000","aria-hidden":"true"},E={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.17ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4495.2 1000","aria-hidden":"true"},b={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""};function S(B,s,A,D,I,M){const e=o("Badge");return p(),l("div",null,[s[53]||(s[53]=n(`Sparse matrices In IncompressibleNavierStokes, all operators are implemented as matrix-free kernels. However, access to the underlying matrices can sometimes be useful, for example to precompute matrix factorizations. We therefore provide sparse matrix versions of some of the linear operators (see full list below ).
Example Consider a simple setup
julia using IncompressibleNavierStokes
+ax = range ( 0 , 1 , 17 );
+setup = Setup (; x = (ax, ax), Re = 1e3 );
(grid = (xlims = ((0.0, 1.0), (0.0, 1.0)), dimension = IncompressibleNavierStokes.Dimension{2}(), N = (18, 18), Nu = ((16, 16), (16, 16)), Np = (16, 16), Iu = (CartesianIndices((2:17, 2:17)), CartesianIndices((2:17, 2:17))), Ip = CartesianIndices((2:17, 2:17)), x = ([-0.0625, 0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0625], [-0.0625, 0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0625]), xu = (([0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0625], [-0.03125, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.03125]), ([-0.03125, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.03125], [0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0625])), xp = ([-0.03125, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.03125], [-0.03125, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.03125]), Δ = ([0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625], [0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625]), Δu = ([0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.03125], [0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.03125]), A = ((([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), ([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])), (([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), ([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])))), boundary_conditions = ((PeriodicBC(), PeriodicBC()), (PeriodicBC(), PeriodicBC())), Re = 1000.0, bodyforce = nothing, issteadybodyforce = false, closure_model = nothing, backend = CPU(false), workgroupsize = 64, temperature = nothing)
The matrices for the linear operators are named by appending _mat
to the function name, for example: divergence
, pressuregradient
, and diffusion
become divergence_mat
, pressuregradient_mat
, diffusion_mat
etc.
Let's assemble some matrices:
julia divergence_mat (setup)
324×648 SparseArrays.SparseMatrixCSC{Float64, Int64} with 1024 stored entries:
+⎡⠀⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣄⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎤
+⎢⠀⠈⠹⢄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠙⢤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣗⣄⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣷⣄⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣕⣄⠀⠀⎥
+⎣⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠃⠑⠀⎦
julia pressuregradient_mat (setup)
648×324 SparseArrays.SparseMatrixCSC{Float64, Int64} with 1024 stored entries:
+⎡⠀⢤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎤
+⎢⠀⠀⠓⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠈⠓⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⣄⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠓⠀⎥
+⎢⠀⢤⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠙⢿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠙⢿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠙⢿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢽⣦⡀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣦⡀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣦⡀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⢽⢦⡀⎥
+⎣⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⠙⎦
julia diffusion_mat (setup)
648×648 SparseArrays.SparseMatrixCSC{Float64, Int64} with 2560 stored entries:
+⎡⣄⣤⣠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎤
+⎢⠈⠻⢷⢗⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠈⠻⣿⣿⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠈⠛⣟⣽⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣵⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠛⠙⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣄⣤⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⢟⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣟⣽⣤⡀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠳⣿⣿⣦⡀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⡀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⢵⢷⣦⡀⎥
+⎣⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠋⠛⠙⎦
`,14)),a("p",null,[s[4]||(s[4]=i("Note the sparsity pattern with matrix concatenation of two scalar operators for operators acting on or producing vector fields. The ")),s[5]||(s[5]=a("code",null,"pressuregradient_mat",-1)),s[6]||(s[6]=i(" converts a scalar field to a vector field, and is thus the vertical concatenation of the matrices for ")),a("mjx-container",d,[(p(),l("svg",k,s[0]||(s[0]=[n(' ',1)]))),s[1]||(s[1]=a("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[a("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[a("mi",null,"∂"),a("mrow",{"data-mjx-texclass":"ORD"},[a("mo",null,"/")]),a("mi",null,"∂"),a("mi",null,"x")])],-1))]),s[7]||(s[7]=i(" and ")),a("mjx-container",c,[(p(),l("svg",g,s[2]||(s[2]=[n(' ',1)]))),s[3]||(s[3]=a("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[a("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[a("mi",null,"∂"),a("mrow",{"data-mjx-texclass":"ORD"},[a("mo",null,"/")]),a("mi",null,"∂"),a("mi",null,"y")])],-1))]),s[8]||(s[8]=i(", while the ")),s[9]||(s[9]=a("code",null,"divergence_mat",-1)),s[10]||(s[10]=i(" is a horizontal concatenation of two similar matrices. The periodic boundary conditions are not included in the operators above, and are implemented via their own matrix. The periodic extension is visible:"))]),s[54]||(s[54]=n(`648×648 SparseArrays.SparseMatrixCSC{Float64, Int64} with 648 stored entries:
+⎡⠀⢄⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠨⠻⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎤
+⎢⠀⠁⠱⢅⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠐⢑⢔⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠐⢑⢔⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠓⢄⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠕⢅⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠕⢅⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⢑⢔⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⢑⢔⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⣦⡂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠑⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢄⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠨⠻⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠕⢅⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠕⢅⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⢑⢔⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⢑⢔⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠑⢤⠀⠀⠀⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠕⢅⠄⠀⠀⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠕⢅⠄⠀⠀⠀⎥
+⎢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⢑⢆⢀⠀⎥
+⎣⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣦⡂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠑⠀⎦
We can verify that the diffusion matrix gives the same results as the diffusion kernel (without viscosity):
julia using Random
+u = randn! ( vectorfield (setup))
+B = bc_u_mat (setup)
+D = diffusion_mat (setup)
+d_kernel = diffusion ( apply_bc_u (u, 0.0 , setup), setup; use_viscosity = false )
+d_matrix = reshape (D * B * u[:], size (u))
+maximum (abs, d_matrix - d_kernel)
`,5)),a("p",null,[s[15]||(s[15]=i("Matrices only work on flattened fields ")),s[16]||(s[16]=a("code",null,"u[:]",-1)),s[17]||(s[17]=i(", while the kernels work on ")),a("mjx-container",m,[(p(),l("svg",u,s[11]||(s[11]=[n(' ',1)]))),s[12]||(s[12]=a("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[a("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[a("mo",{stretchy:"false"},"("),a("mi",null,"D"),a("mo",null,"+"),a("mn",null,"1"),a("mo",{stretchy:"false"},")")])],-1))]),s[18]||(s[18]=i("-array-shaped fields for a dimension ")),a("mjx-container",E,[(p(),l("svg",y,s[13]||(s[13]=[n(' ',1)]))),s[14]||(s[14]=a("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[a("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[a("mi",null,"D"),a("mo",null,"∈"),a("mo",{fence:"false",stretchy:"false"},"{"),a("mn",null,"2"),a("mo",null,","),a("mn",null,"3"),a("mo",{fence:"false",stretchy:"false"},"}")])],-1))]),s[19]||(s[19]=i("."))]),s[55]||(s[55]=n(`Boundary conditions and matrices Matrices can only be used to represent boundary conditions that depend linearly on the input, such as periodic or Neumann boundary conditions. Non-zero Dirichlet boundary conditions need to be accounted for separately. Consider the following inflow-setup:
julia setup = Setup (;
+ x = (ax, ax),
+ boundary_conditions = (
+ ( DirichletBC (( 10.0 , 0.0 )), PressureBC ()),
+ ( DirichletBC (), DirichletBC ()),
+ ),
+)
(grid = (xlims = ((0.0, 1.0), (0.0, 1.0)), dimension = IncompressibleNavierStokes.Dimension{2}(), N = (18, 18), Nu = ((16, 16), (16, 15)), Np = (16, 16), Iu = (CartesianIndices((2:17, 2:17)), CartesianIndices((2:17, 2:16))), Ip = CartesianIndices((2:17, 2:17)), x = ([0.0, 0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0], [0.0, 0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0]), xu = (([0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0], [0.0, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.0]), ([0.0, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.0], [0.0, 0.0625, 0.125, 0.1875, 0.25, 0.3125, 0.375, 0.4375, 0.5, 0.5625, 0.625, 0.6875, 0.75, 0.8125, 0.875, 0.9375, 1.0, 1.0])), xp = ([0.0, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.0], [0.0, 0.03125, 0.09375, 0.15625, 0.21875, 0.28125, 0.34375, 0.40625, 0.46875, 0.53125, 0.59375, 0.65625, 0.71875, 0.78125, 0.84375, 0.90625, 0.96875, 1.0]), Δ = ([2.220446049250313e-16, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 2.220446049250313e-16], [2.220446049250313e-16, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 2.220446049250313e-16]), Δu = ([0.03125, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.03125, 2.220446049250313e-16], [0.03125, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.0625, 0.03125, 2.220446049250313e-16]), A = ((([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0]), ([1.0, 1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0], [0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0, 1.0])), (([1.0, 1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.0], [0.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0, 1.0]), ([1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0])))), boundary_conditions = ((DirichletBC{Tuple{Float64, Float64}}((10.0, 0.0)), PressureBC()), (DirichletBC{Nothing}(nothing), DirichletBC{Nothing}(nothing))), Re = 1000.0, bodyforce = nothing, issteadybodyforce = false, closure_model = nothing, backend = CPU(false), workgroupsize = 64, temperature = nothing)
We can assert that the kernel and matrix versions of the divergence give different results:
julia using Random
+u = randn! ( vectorfield (setup))
+B = bc_u_mat (setup)
+M = divergence_mat (setup)
+div_kernel = divergence ( apply_bc_u (u, 0.0 , setup), setup)
+div_matrix = reshape (M * B * u[:], size (div_kernel))
+maximum (abs, div_matrix - div_kernel)
The solution is to create a vector containing the boundary conditions. This is done by applying the BC kernel on an empty field:
julia uzero = zero (u)
+yu = apply_bc_u (uzero, 0.0 , setup)
+yM = divergence (yu, setup)
18×18 Matrix{Float64}:
+ 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0
+ 0.0 -160.0 -160.0 -160.0 -160.0 -160.0 -160.0 -160.0 -160.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 … 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
By adding yM
, we get the equality:
julia maximum (abs, (div_matrix + yM) - div_kernel)
API `,14)),a("details",b,[a("summary",null,[s[20]||(s[20]=a("a",{id:"IncompressibleNavierStokes.bc_p_mat",href:"#IncompressibleNavierStokes.bc_p_mat"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.bc_p_mat")],-1)),s[21]||(s[21]=i()),t(e,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[22]||(s[22]=a("p",null,[i("Matrix for applying boundary conditions to pressure fields "),a("code",null,"p"),i(".")],-1)),s[23]||(s[23]=a("p",null,[a("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/matrices.jl#L61",target:"_blank",rel:"noreferrer"},"source")],-1))]),a("details",T,[a("summary",null,[s[24]||(s[24]=a("a",{id:"IncompressibleNavierStokes.bc_temp_mat",href:"#IncompressibleNavierStokes.bc_temp_mat"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.bc_temp_mat")],-1)),s[25]||(s[25]=i()),t(e,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[26]||(s[26]=a("p",null,[i("Matrix for applying boundary conditions to temperature fields "),a("code",null,"temp"),i(".")],-1)),s[27]||(s[27]=a("p",null,[a("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/matrices.jl#L64",target:"_blank",rel:"noreferrer"},"source")],-1))]),a("details",Q,[a("summary",null,[s[28]||(s[28]=a("a",{id:"IncompressibleNavierStokes.bc_u_mat",href:"#IncompressibleNavierStokes.bc_u_mat"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.bc_u_mat")],-1)),s[29]||(s[29]=i()),t(e,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[30]||(s[30]=a("p",null,[i("Create matrix for applying boundary conditions to velocity fields "),a("code",null,"u"),i(". This matrix only applies the boundary conditions depending on "),a("code",null,"u"),i(" itself (e.g. "),a("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/manual/setup#IncompressibleNavierStokes.PeriodicBC"},[a("code",null,"PeriodicBC")]),i("). It does not apply constant boundary conditions (e.g. non-zero "),a("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/manual/setup#IncompressibleNavierStokes.DirichletBC"},[a("code",null,"DirichletBC")]),i(").")],-1)),s[31]||(s[31]=a("p",null,[a("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/matrices.jl#L54",target:"_blank",rel:"noreferrer"},"source")],-1))]),a("details",v,[a("summary",null,[s[32]||(s[32]=a("a",{id:"IncompressibleNavierStokes.diffusion_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.diffusion_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.diffusion_mat")],-1)),s[33]||(s[33]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[34]||(s[34]=n(`julia diffusion_mat (
+ setup
+) -> SparseArrays . SparseMatrixCSC{Tv, Int64} where Tv
Diffusion matrix.
source
`,3))]),a("details",f,[a("summary",null,[s[35]||(s[35]=a("a",{id:"IncompressibleNavierStokes.divergence_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.divergence_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.divergence_mat")],-1)),s[36]||(s[36]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[37]||(s[37]=n(`julia divergence_mat (
+ setup
+) -> SparseArrays . SparseMatrixCSC{Tv, Int64} where Tv
Divergence matrix.
source
`,3))]),a("details",C,[a("summary",null,[s[38]||(s[38]=a("a",{id:"IncompressibleNavierStokes.laplacian_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.laplacian_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.laplacian_mat")],-1)),s[39]||(s[39]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[40]||(s[40]=n('julia laplacian_mat (setup) -> Any
Get matrix for the Laplacian operator (for the pressure-Poisson equation). This matrix takes scalar field inputs restricted to the actual degrees of freedom.
source
',3))]),a("details",x,[a("summary",null,[s[41]||(s[41]=a("a",{id:"IncompressibleNavierStokes.pad_scalarfield_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.pad_scalarfield_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.pad_scalarfield_mat")],-1)),s[42]||(s[42]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[43]||(s[43]=n('julia pad_scalarfield_mat (setup) -> Any
Create matrix for padding inner scalar field with boundary volumes. This can be useful for algorithms that require vectors with degrees of freedom only, and not the ghost volumes. To go back, simply transpose the matrix.
See also: pad_vectorfield_mat
.
source
',4))]),a("details",F,[a("summary",null,[s[44]||(s[44]=a("a",{id:"IncompressibleNavierStokes.pad_vectorfield_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.pad_vectorfield_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.pad_vectorfield_mat")],-1)),s[45]||(s[45]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[46]||(s[46]=n(`julia pad_vectorfield_mat (
+ setup
+) -> SparseArrays . SparseMatrixCSC{Tv, Int64} where Tv
Create matrix for padding inner vector field with boundary volumes, similar to pad_scalarfield_mat
.
source
`,3))]),a("details",j,[a("summary",null,[s[47]||(s[47]=a("a",{id:"IncompressibleNavierStokes.pressuregradient_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.pressuregradient_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.pressuregradient_mat")],-1)),s[48]||(s[48]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[49]||(s[49]=n(`julia pressuregradient_mat (
+ setup
+) -> SparseArrays . SparseMatrixCSC{Tv, Int64} where Tv
Pressure gradient matrix.
source
`,3))]),a("details",w,[a("summary",null,[s[50]||(s[50]=a("a",{id:"IncompressibleNavierStokes.volume_mat-Tuple{Any}",href:"#IncompressibleNavierStokes.volume_mat-Tuple{Any}"},[a("span",{class:"jlbinding"},"IncompressibleNavierStokes.volume_mat")],-1)),s[51]||(s[51]=i()),t(e,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[52]||(s[52]=n('julia volume_mat (setup) -> Any
Volume-size matrix.
source
',3))])])}const _=r(h,[["render",S]]);export{L as __pageData,_ as default};
diff --git a/previews/PR126/assets/manual_ns.md.Bdh0AlV6.js b/previews/PR126/assets/manual_ns.md.Bdh0AlV6.js
new file mode 100644
index 00000000..c7aff7e0
--- /dev/null
+++ b/previews/PR126/assets/manual_ns.md.Bdh0AlV6.js
@@ -0,0 +1 @@
+import{_ as s,c as T,j as t,a,a5 as l,o as e}from"./chunks/framework.BSoZtefh.js";const U1=JSON.parse('{"title":"Incompressible Navier-Stokes equations","description":"","frontmatter":{},"headers":[],"relativePath":"manual/ns.md","filePath":"manual/ns.md","lastUpdated":null}'),o={name:"manual/ns.md"},n={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.279ex"},xmlns:"http://www.w3.org/2000/svg",width:"36.051ex",height:"7.69ex",role:"img",focusable:"false",viewBox:"0 -1949.5 15934.4 3399","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.304ex",height:"2.022ex",role:"img",focusable:"false",viewBox:"0 -853.7 3228.3 893.7","aria-hidden":"true"},i={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.473ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4187.2 1000","aria-hidden":"true"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.708ex",height:"2.497ex",role:"img",focusable:"false",viewBox:"0 -853.7 6942.8 1103.7","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.138ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 503 636","aria-hidden":"true"},x={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.199ex",height:"1ex",role:"img",focusable:"false",viewBox:"0 -442 530 442","aria-hidden":"true"},H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.798ex",height:"2.497ex",role:"img",focusable:"false",viewBox:"0 -853.7 6982.8 1103.7","aria-hidden":"true"},L={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.708ex",height:"2.497ex",role:"img",focusable:"false",viewBox:"0 -853.7 6942.8 1103.7","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.817ex",height:"1.441ex",role:"img",focusable:"false",viewBox:"0 -626 361 637","aria-hidden":"true"},V={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Z={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.633ex",height:"1.593ex",role:"img",focusable:"false",viewBox:"0 -704 722 704","aria-hidden":"true"},v={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-5.033ex"},xmlns:"http://www.w3.org/2000/svg",width:"68.204ex",height:"11.197ex",role:"img",focusable:"false",viewBox:"0 -2724.5 30146.3 4949","aria-hidden":"true"},D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.451ex",height:"1.686ex",role:"img",focusable:"false",viewBox:"0 -705 2851.6 745","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},O={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.081ex",height:"1.667ex",role:"img",focusable:"false",viewBox:"0 -715 1362 737","aria-hidden":"true"},R={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.357ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 600 453","aria-hidden":"true"},S={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},z={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.672ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1181 705","aria-hidden":"true"},J={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},G={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.564ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.059ex",height:"2.26ex",role:"img",focusable:"false",viewBox:"0 -749.5 1352 999","aria-hidden":"true"},A={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},P={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.345ex",height:"1.708ex",role:"img",focusable:"false",viewBox:"0 -715 3246.6 755","aria-hidden":"true"},X={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.373ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.081ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -583 3571.7 747.8","aria-hidden":"true"},N={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.414ex",height:"1.538ex",role:"img",focusable:"false",viewBox:"0 -680 625 680","aria-hidden":"true"},q={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.373ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.77ex",height:"1.373ex",role:"img",focusable:"false",viewBox:"0 -442 1666.2 606.8","aria-hidden":"true"},K={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.319ex",height:"1.731ex",role:"img",focusable:"false",viewBox:"0 -683 4561 765","aria-hidden":"true"},$={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.414ex",height:"1.538ex",role:"img",focusable:"false",viewBox:"0 -680 625 680","aria-hidden":"true"},Y={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},_={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.649ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6917 1000","aria-hidden":"true"},t1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.337ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6779 1000","aria-hidden":"true"},a1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.474ex",height:"1.629ex",role:"img",focusable:"false",viewBox:"0 -680 2419.6 720","aria-hidden":"true"},e1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.281ex",height:"1.803ex",role:"img",focusable:"false",viewBox:"0 -715 4986 797","aria-hidden":"true"},s1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.029ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.17ex",height:"1.005ex",role:"img",focusable:"false",viewBox:"0 -431 517 444","aria-hidden":"true"},n1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.432ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 3727 748","aria-hidden":"true"},r1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.414ex",height:"1.538ex",role:"img",focusable:"false",viewBox:"0 -680 625 680","aria-hidden":"true"},i1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.339ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 7222 1000","aria-hidden":"true"},p1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},g1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.791ex"},xmlns:"http://www.w3.org/2000/svg",width:"31.053ex",height:"2.826ex",role:"img",focusable:"false",viewBox:"0 -899.5 13725.4 1249","aria-hidden":"true"},u1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},w1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.06ex"},xmlns:"http://www.w3.org/2000/svg",width:"52.786ex",height:"6.999ex",role:"img",focusable:"false",viewBox:"0 -1740.7 23331.5 3093.4","aria-hidden":"true"},x1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},H1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.781ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.632ex",height:"2.737ex",role:"img",focusable:"false",viewBox:"0 -864.9 3373.3 1209.9","aria-hidden":"true"},L1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.781ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.535ex",height:"2.737ex",role:"img",focusable:"false",viewBox:"0 -864.9 4656.7 1209.9","aria-hidden":"true"},k1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.202ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.008ex",height:"3.159ex",role:"img",focusable:"false",viewBox:"0 -864.9 11053.8 1396.1","aria-hidden":"true"},V1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Z1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.369ex",height:"1.731ex",role:"img",focusable:"false",viewBox:"0 -683 4583 765","aria-hidden":"true"},v1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},b1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.679ex"},xmlns:"http://www.w3.org/2000/svg",width:"18.695ex",height:"5.095ex",role:"img",focusable:"false",viewBox:"0 -1509.9 8263.1 2251.9","aria-hidden":"true"},D1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},j1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-5.011ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.567ex",height:"11.153ex",role:"img",focusable:"false",viewBox:"0 -2714.9 9090.8 4929.8","aria-hidden":"true"},C1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},O1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.91ex",role:"img",focusable:"false",viewBox:"0 -833.2 1008.6 844.2","aria-hidden":"true"},R1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.473ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -694 651 899","aria-hidden":"true"},S1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},z1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.679ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.371ex",height:"4.826ex",role:"img",focusable:"false",viewBox:"0 -1391 11214 2132.9","aria-hidden":"true"},J1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},G1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.159ex",height:"2.464ex",role:"img",focusable:"false",viewBox:"0 -883.9 4932.1 1088.9","aria-hidden":"true"},A1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},P1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.063ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -694 4890 899","aria-hidden":"true"},X1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},F1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.049ex",height:"2.464ex",role:"img",focusable:"false",viewBox:"0 -883.9 6209.6 1088.9","aria-hidden":"true"};function N1(I1,Q,q1,E1,K1,W1){return e(),T("div",null,[Q[138]||(Q[138]=t("h1",{id:"Incompressible-Navier-Stokes-equations",tabindex:"-1"},[a("Incompressible Navier-Stokes equations "),t("a",{class:"header-anchor",href:"#Incompressible-Navier-Stokes-equations","aria-label":'Permalink to "Incompressible Navier-Stokes equations {#Incompressible-Navier-Stokes-equations}"'},"")],-1)),Q[139]||(Q[139]=t("p",null,"The incompressible Navier-Stokes equations describe conservation of mass and conservation of momentum, which can be written as a divergence-free constraint and an evolution equation:",-1)),t("mjx-container",n,[(e(),T("svg",m,Q[0]||(Q[0]=[l(' ',1)]))),Q[1]||(Q[1]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"⋅"),t("mi",null,"u")]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mn",null,"0"),t("mo",null,",")])]),t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("mi",null,"u")]),t("mrow",null,[t("mi",null,"∂"),t("mi",null,"t")])]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"⋅"),t("mo",{stretchy:"false"},"("),t("mi",null,"u"),t("msup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"sans-serif"},"T")])]),t("mo",{stretchy:"false"},")")]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"∇"),t("mi",null,"p"),t("mo",null,"+"),t("mi",null,"ν"),t("msup",null,[t("mi",{mathvariant:"normal"},"∇"),t("mn",null,"2")]),t("mi",null,"u"),t("mo",null,"+"),t("mi",null,"f"),t("mo",null,",")])])])])],-1))]),t("p",null,[Q[20]||(Q[20]=a("where ")),t("mjx-container",r,[(e(),T("svg",d,Q[2]||(Q[2]=[l(' ',1)]))),Q[3]||(Q[3]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Ω"),t("mo",null,"⊂"),t("msup",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"double-struck"},"R")]),t("mi",null,"d")])])],-1))]),Q[21]||(Q[21]=a(" is the domain, ")),t("mjx-container",i,[(e(),T("svg",h,Q[4]||(Q[4]=[l(' ',1)]))),Q[5]||(Q[5]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"d"),t("mo",null,"∈"),t("mo",{fence:"false",stretchy:"false"},"{"),t("mn",null,"2"),t("mo",null,","),t("mn",null,"3"),t("mo",{fence:"false",stretchy:"false"},"}")])],-1))]),Q[22]||(Q[22]=a(" is the spatial dimension, ")),t("mjx-container",p,[(e(),T("svg",g,Q[6]||(Q[6]=[l(' ',1)]))),Q[7]||(Q[7]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"u"),t("mn",null,"1")]),t("mo",null,","),t("mo",null,"…"),t("mo",null,","),t("msup",null,[t("mi",null,"u"),t("mi",null,"d")]),t("mo",{stretchy:"false"},")")])],-1))]),Q[23]||(Q[23]=a(" is the velocity field, ")),t("mjx-container",u,[(e(),T("svg",w,Q[8]||(Q[8]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45D",d:"M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[9]||(Q[9]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"p")])],-1))]),Q[24]||(Q[24]=a(" is the pressure, ")),t("mjx-container",x,[(e(),T("svg",c,Q[10]||(Q[10]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D708",d:"M74 431Q75 431 146 436T219 442Q231 442 231 434Q231 428 185 241L137 51H140L150 55Q161 59 177 67T214 86T261 119T312 165Q410 264 445 394Q458 442 496 442Q509 442 519 434T530 411Q530 390 516 352T469 262T388 162T267 70T106 5Q81 -2 71 -2Q66 -2 59 -1T51 1Q45 5 45 11Q45 13 88 188L132 364Q133 377 125 380T86 385H65Q59 391 59 393T61 412Q65 431 74 431Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[11]||(Q[11]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"ν")])],-1))]),Q[25]||(Q[25]=a(" is the kinematic viscosity, and ")),t("mjx-container",H,[(e(),T("svg",f,Q[12]||(Q[12]=[l(' ',1)]))),Q[13]||(Q[13]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"f"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"f"),t("mn",null,"1")]),t("mo",null,","),t("mo",null,"…"),t("mo",null,","),t("msup",null,[t("mi",null,"f"),t("mi",null,"d")]),t("mo",{stretchy:"false"},")")])],-1))]),Q[26]||(Q[26]=a(" is the body force per unit of volume. The velocity, pressure, and body force are functions of the spatial coordinate ")),t("mjx-container",L,[(e(),T("svg",y,Q[14]||(Q[14]=[l(' ',1)]))),Q[15]||(Q[15]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"x"),t("mn",null,"1")]),t("mo",null,","),t("mo",null,"…"),t("mo",null,","),t("msup",null,[t("mi",null,"x"),t("mi",null,"d")]),t("mo",{stretchy:"false"},")")])],-1))]),Q[27]||(Q[27]=a(" and time ")),t("mjx-container",k,[(e(),T("svg",M,Q[16]||(Q[16]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D461",d:"M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[17]||(Q[17]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"t")])],-1))]),Q[28]||(Q[28]=a(". We assume that ")),t("mjx-container",V,[(e(),T("svg",Z,Q[18]||(Q[18]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"3A9",d:"M55 454Q55 503 75 546T127 617T197 665T272 695T337 704H352Q396 704 404 703Q527 687 596 615T666 454Q666 392 635 330T559 200T499 83V80H543Q589 81 600 83T617 93Q622 102 629 135T636 172L637 177H677V175L660 89Q645 3 644 2V0H552H488Q461 0 456 3T451 20Q451 89 499 235T548 455Q548 512 530 555T483 622T424 656T361 668Q332 668 303 658T243 626T193 560T174 456Q174 380 222 233T270 20Q270 7 263 0H77V2Q76 3 61 89L44 175V177H84L85 172Q85 171 88 155T96 119T104 93Q109 86 120 84T178 80H222V83Q206 132 162 199T87 329T55 454Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[19]||(Q[19]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Ω")])],-1))]),Q[29]||(Q[29]=a(" is a rectangular domain."))]),Q[140]||(Q[140]=t("h2",{id:"Integral-form",tabindex:"-1"},[a("Integral form "),t("a",{class:"header-anchor",href:"#Integral-form","aria-label":'Permalink to "Integral form {#Integral-form}"'},"")],-1)),Q[141]||(Q[141]=t("p",null,"The integral form of the Navier-Stokes equations is used as starting point to develop a spatial discretization:",-1)),t("mjx-container",v,[(e(),T("svg",b,Q[30]||(Q[30]=[l(' ',1)]))),Q[31]||(Q[31]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])]),t("msub",null,[t("mo",{"data-mjx-texclass":"OP"},"∫"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"∂"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")])])]),t("mi",null,"u"),t("mo",null,"⋅"),t("mi",null,"n"),t("mstyle",{scriptlevel:"0"},[t("mspace",{width:"0.167em"})]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",{mathvariant:"normal"},"Γ")]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mn",null,"0"),t("mo",null,",")])]),t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])]),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])]),t("msub",null,[t("mo",{"data-mjx-texclass":"OP"},"∫"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")])]),t("mi",null,"u"),t("mstyle",{scriptlevel:"0"},[t("mspace",{width:"0.167em"})]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",{mathvariant:"normal"},"Ω")]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])]),t("msub",null,[t("mo",{"data-mjx-texclass":"OP"},"∫"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"∂"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")])])]),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mo",null,"−"),t("mi",null,"u"),t("msup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"sans-serif"},"T")])]),t("mo",null,"−"),t("mi",null,"p"),t("mi",null,"I"),t("mo",null,"+"),t("mi",null,"ν"),t("mi",{mathvariant:"normal"},"∇"),t("mi",null,"u"),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("mo",null,"⋅"),t("mi",null,"n"),t("mstyle",{scriptlevel:"0"},[t("mspace",{width:"0.167em"})]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",{mathvariant:"normal"},"Γ"),t("mo",null,"+"),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])]),t("msub",null,[t("mo",{"data-mjx-texclass":"OP"},"∫"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")])]),t("mi",null,"f"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",{mathvariant:"normal"},"Ω"),t("mo",null,",")])])])])],-1))]),t("p",null,[Q[42]||(Q[42]=a("where ")),t("mjx-container",D,[(e(),T("svg",j,Q[32]||(Q[32]=[l(' ',1)]))),Q[33]||(Q[33]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",null,"⊂"),t("mi",{mathvariant:"normal"},"Ω")])],-1))]),Q[43]||(Q[43]=a(" is an arbitrary control volume with boundary ")),t("mjx-container",C,[(e(),T("svg",O,Q[34]||(Q[34]=[l(' ',1)]))),Q[35]||(Q[35]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"∂"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")])])],-1))]),Q[44]||(Q[44]=a(", normal ")),t("mjx-container",R,[(e(),T("svg",B,Q[36]||(Q[36]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45B",d:"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[37]||(Q[37]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"n")])],-1))]),Q[45]||(Q[45]=a(", surface element ")),t("mjx-container",S,[(e(),T("svg",z,Q[38]||(Q[38]=[l(' ',1)]))),Q[39]||(Q[39]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",{mathvariant:"normal"},"Γ")])],-1))]),Q[46]||(Q[46]=a(", and volume size ")),t("mjx-container",J,[(e(),T("svg",G,Q[40]||(Q[40]=[l(' ',1)]))),Q[41]||(Q[41]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),Q[47]||(Q[47]=a(". We have divided by the control volume sizes in the integral form."))]),Q[142]||(Q[142]=t("h2",{id:"Boundary-conditions",tabindex:"-1"},[a("Boundary conditions "),t("a",{class:"header-anchor",href:"#Boundary-conditions","aria-label":'Permalink to "Boundary conditions {#Boundary-conditions}"'},"")],-1)),t("p",null,[Q[50]||(Q[50]=a("The boundary conditions on a part of the boundary ")),t("mjx-container",A,[(e(),T("svg",P,Q[48]||(Q[48]=[l(' ',1)]))),Q[49]||(Q[49]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Γ"),t("mo",null,"⊂"),t("mi",null,"∂"),t("mi",{mathvariant:"normal"},"Ω")])],-1))]),Q[51]||(Q[51]=a(" are one or more of the following:"))]),t("ul",null,[t("li",null,[t("p",null,[Q[58]||(Q[58]=a("Dirichlet: ")),t("mjx-container",X,[(e(),T("svg",F,Q[52]||(Q[52]=[l(' ',1)]))),Q[53]||(Q[53]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u"),t("mo",null,"="),t("msub",null,[t("mi",null,"u"),t("mtext",null,"BC")])])],-1))]),Q[59]||(Q[59]=a(" on ")),t("mjx-container",N,[(e(),T("svg",I,Q[54]||(Q[54]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"393",d:"M128 619Q121 626 117 628T101 631T58 634H25V680H554V676Q556 670 568 560T582 444V440H542V444Q542 445 538 478T523 545T492 598Q454 634 349 634H334Q264 634 249 633T233 621Q232 618 232 339L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[55]||(Q[55]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Γ")])],-1))]),Q[60]||(Q[60]=a(" for some ")),t("mjx-container",q,[(e(),T("svg",E,Q[56]||(Q[56]=[l(' ',1)]))),Q[57]||(Q[57]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mtext",null,"BC")])])],-1))]),Q[61]||(Q[61]=a(";"))])]),t("li",null,[t("p",null,[Q[66]||(Q[66]=a("Neumann: ")),t("mjx-container",K,[(e(),T("svg",W,Q[62]||(Q[62]=[l(' ',1)]))),Q[63]||(Q[63]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"∇"),t("mi",null,"u"),t("mo",null,"⋅"),t("mi",null,"n"),t("mo",null,"="),t("mn",null,"0")])],-1))]),Q[67]||(Q[67]=a(" on ")),t("mjx-container",$,[(e(),T("svg",U,Q[64]||(Q[64]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"393",d:"M128 619Q121 626 117 628T101 631T58 634H25V680H554V676Q556 670 568 560T582 444V440H542V444Q542 445 538 478T523 545T492 598Q454 634 349 634H334Q264 634 249 633T233 621Q232 618 232 339L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[65]||(Q[65]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Γ")])],-1))]),Q[68]||(Q[68]=a(";"))])]),t("li",null,[t("p",null,[Q[79]||(Q[79]=a("Periodic: ")),t("mjx-container",Y,[(e(),T("svg",_,Q[69]||(Q[69]=[l(' ',1)]))),Q[70]||(Q[70]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("mi",null,"x"),t("mo",{stretchy:"false"},")"),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"τ"),t("mo",{stretchy:"false"},")")])],-1))]),Q[80]||(Q[80]=a(" and ")),t("mjx-container",t1,[(e(),T("svg",Q1,Q[71]||(Q[71]=[l(' ',1)]))),Q[72]||(Q[72]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"p"),t("mo",{stretchy:"false"},"("),t("mi",null,"x"),t("mo",{stretchy:"false"},")"),t("mo",null,"="),t("mi",null,"p"),t("mo",{stretchy:"false"},"("),t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"τ"),t("mo",{stretchy:"false"},")")])],-1))]),Q[81]||(Q[81]=a(" for ")),t("mjx-container",a1,[(e(),T("svg",T1,Q[73]||(Q[73]=[l(' ',1)]))),Q[74]||(Q[74]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"∈"),t("mi",{mathvariant:"normal"},"Γ")])],-1))]),Q[82]||(Q[82]=a(", where ")),t("mjx-container",e1,[(e(),T("svg",l1,Q[75]||(Q[75]=[l(' ',1)]))),Q[76]||(Q[76]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Γ"),t("mo",null,"+"),t("mi",null,"τ"),t("mo",null,"⊂"),t("mi",null,"∂"),t("mi",{mathvariant:"normal"},"Ω")])],-1))]),Q[83]||(Q[83]=a(" is another part of the boundary and ")),t("mjx-container",s1,[(e(),T("svg",o1,Q[77]||(Q[77]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D70F",d:"M39 284Q18 284 18 294Q18 301 45 338T99 398Q134 425 164 429Q170 431 332 431Q492 431 497 429Q517 424 517 402Q517 388 508 376T485 360Q479 358 389 358T299 356Q298 355 283 274T251 109T233 20Q228 5 215 -4T186 -13Q153 -13 153 20V30L203 192Q214 228 227 272T248 336L254 357Q254 358 208 358Q206 358 197 358T183 359Q105 359 61 295Q56 287 53 286T39 284Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[78]||(Q[78]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"τ")])],-1))]),Q[84]||(Q[84]=a(" is a translation vector;"))])]),t("li",null,[t("p",null,[Q[91]||(Q[91]=a("Stress free: ")),t("mjx-container",n1,[(e(),T("svg",m1,Q[85]||(Q[85]=[l(' ',1)]))),Q[86]||(Q[86]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"σ"),t("mo",null,"⋅"),t("mi",null,"n"),t("mo",null,"="),t("mn",null,"0")])],-1))]),Q[92]||(Q[92]=a(" on ")),t("mjx-container",r1,[(e(),T("svg",d1,Q[87]||(Q[87]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"393",d:"M128 619Q121 626 117 628T101 631T58 634H25V680H554V676Q556 670 568 560T582 444V440H542V444Q542 445 538 478T523 545T492 598Q454 634 349 634H334Q264 634 249 633T233 621Q232 618 232 339L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[88]||(Q[88]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Γ")])],-1))]),Q[93]||(Q[93]=a(", where ")),t("mjx-container",i1,[(e(),T("svg",h1,Q[89]||(Q[89]=[l(' ',1)]))),Q[90]||(Q[90]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"σ"),t("mo",null,"="),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mo",null,"−"),t("mi",null,"p"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"I")]),t("mo",null,"+"),t("mn",null,"2"),t("mi",null,"ν"),t("mi",null,"S"),t("mo",{"data-mjx-texclass":"CLOSE"},")")])])],-1))]),Q[94]||(Q[94]=a("."))])])]),Q[143]||(Q[143]=t("h2",{id:"Pressure-equation",tabindex:"-1"},[a("Pressure equation "),t("a",{class:"header-anchor",href:"#Pressure-equation","aria-label":'Permalink to "Pressure equation {#Pressure-equation}"'},"")],-1)),Q[144]||(Q[144]=t("p",null,"Taking the divergence of the momemtum equations yields a Poisson equation for the pressure:",-1)),t("mjx-container",p1,[(e(),T("svg",g1,Q[95]||(Q[95]=[l(' ',1)]))),Q[96]||(Q[96]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mo",null,"−"),t("msup",null,[t("mi",{mathvariant:"normal"},"∇"),t("mn",null,"2")]),t("mi",null,"p"),t("mo",null,"="),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"⋅"),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"⋅"),t("mo",{stretchy:"false"},"("),t("mi",null,"u"),t("msup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"sans-serif"},"T")])]),t("mo",{stretchy:"false"},")"),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"⋅"),t("mi",null,"f")])],-1))]),Q[145]||(Q[145]=t("p",null,"In scalar notation, this becomes",-1)),t("mjx-container",u1,[(e(),T("svg",w1,Q[97]||(Q[97]=[l(' ',1)]))),Q[98]||(Q[98]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mo",null,"−"),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"α"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"d")]),t("mfrac",null,[t("msup",null,[t("mi",null,"∂"),t("mn",null,"2")]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"α")]),t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"α")])])]),t("mi",null,"p"),t("mo",null,"="),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"α"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"d")]),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"β"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"d")]),t("mfrac",null,[t("msup",null,[t("mi",null,"∂"),t("mn",null,"2")]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"α")]),t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"β")])])]),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"u"),t("mi",null,"α")]),t("msup",null,[t("mi",null,"u"),t("mi",null,"β")]),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"α"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"d")]),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"f"),t("mi",null,"α")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"α")])])]),t("mo",null,".")])],-1))]),Q[146]||(Q[146]=t("p",null,"Note the absence of time derivatives in the pressure equation. While the velocity field evolves in time, the pressure only changes such that the velocity stays divergence free.",-1)),t("p",null,[Q[101]||(Q[101]=a("If there are no pressure boundary conditions, the pressure is only unique up to a constant. We set this constant to ")),t("mjx-container",x1,[(e(),T("svg",c1,Q[99]||(Q[99]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mn"},[t("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[100]||(Q[100]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"1")])],-1))]),Q[102]||(Q[102]=a("."))]),Q[147]||(Q[147]=t("h2",{id:"Other-quantities-of-interest",tabindex:"-1"},[a("Other quantities of interest "),t("a",{class:"header-anchor",href:"#Other-quantities-of-interest","aria-label":'Permalink to "Other quantities of interest {#Other-quantities-of-interest}"'},"")],-1)),Q[148]||(Q[148]=t("h3",{id:"Reynolds-number",tabindex:"-1"},[a("Reynolds number "),t("a",{class:"header-anchor",href:"#Reynolds-number","aria-label":'Permalink to "Reynolds number {#Reynolds-number}"'},"")],-1)),t("p",null,[Q[105]||(Q[105]=a("The Reynolds number is the inverse of the viscosity: ")),t("mjx-container",H1,[(e(),T("svg",f1,Q[103]||(Q[103]=[l(' ',1)]))),Q[104]||(Q[104]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"R"),t("mi",null,"e"),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mi",null,"ν")])])],-1))]),Q[106]||(Q[106]=a(". It is the only flow parameter governing the incompressible Navier-Stokes equations."))]),Q[149]||(Q[149]=t("h3",{id:"Kinetic-energy",tabindex:"-1"},[a("Kinetic energy "),t("a",{class:"header-anchor",href:"#Kinetic-energy","aria-label":'Permalink to "Kinetic energy {#Kinetic-energy}"'},"")],-1)),t("p",null,[Q[111]||(Q[111]=a("The local and total kinetic energy are defined by ")),t("mjx-container",L1,[(e(),T("svg",y1,Q[107]||(Q[107]=[l(' ',1)]))),Q[108]||(Q[108]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"k"),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")]),t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mi",null,"u"),t("msubsup",null,[t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mn",null,"2"),t("mn",null,"2")])])],-1))]),Q[112]||(Q[112]=a(" and ")),t("mjx-container",k1,[(e(),T("svg",M1,Q[109]||(Q[109]=[l(' ',1)]))),Q[110]||(Q[110]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"K"),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")]),t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mi",null,"u"),t("msubsup",null,[t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mrow",{"data-mjx-texclass":"ORD"},[t("msup",null,[t("mi",null,"L"),t("mn",null,"2")]),t("mo",{stretchy:"false"},"("),t("mi",{mathvariant:"normal"},"Ω"),t("mo",{stretchy:"false"},")")]),t("mn",null,"2")]),t("mo",null,"="),t("msub",null,[t("mo",{"data-mjx-texclass":"OP"},"∫"),t("mi",{mathvariant:"normal"},"Ω")]),t("mi",null,"k"),t("mstyle",{scriptlevel:"0"},[t("mspace",{width:"0.167em"})]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",{mathvariant:"normal"},"Ω")])],-1))]),Q[113]||(Q[113]=a("."))]),Q[150]||(Q[150]=t("h3",{id:"vorticity",tabindex:"-1"},[a("Vorticity "),t("a",{class:"header-anchor",href:"#vorticity","aria-label":'Permalink to "Vorticity"'},"")],-1)),t("p",null,[Q[116]||(Q[116]=a("The vorticity is defined as ")),t("mjx-container",V1,[(e(),T("svg",Z1,Q[114]||(Q[114]=[l(' ',1)]))),Q[115]||(Q[115]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"ω"),t("mo",null,"="),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"×"),t("mi",null,"u")])],-1))]),Q[117]||(Q[117]=a("."))]),Q[151]||(Q[151]=t("p",null,"In 2D, it is a scalar field given by",-1)),t("mjx-container",v1,[(e(),T("svg",b1,Q[118]||(Q[118]=[l(' ',1)]))),Q[119]||(Q[119]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"ω"),t("mo",null,"="),t("mo",null,"−"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"1")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"2")])])]),t("mo",null,"+"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"2")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"1")])])]),t("mo",null,".")])],-1))]),Q[152]||(Q[152]=t("p",null,"In 3D, it is a vector field given by",-1)),t("mjx-container",D1,[(e(),T("svg",j1,Q[120]||(Q[120]=[l(' ',1)]))),Q[121]||(Q[121]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"ω"),t("mo",null,"="),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mtable",{columnspacing:"1em",rowspacing:"4pt"},[t("mtr",null,[t("mtd",null,[t("mo",null,"−"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"2")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"3")])])]),t("mo",null,"+"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"3")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"2")])])])])]),t("mtr",null,[t("mtd",null,[t("mo",null,"−"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"3")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"1")])])]),t("mo",null,"+"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"1")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"3")])])])])]),t("mtr",null,[t("mtd",null,[t("mo",null,"−"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"1")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"2")])])]),t("mo",null,"+"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"2")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"1")])])])])])]),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("mo",null,".")])],-1))]),t("p",null,[Q[124]||(Q[124]=a("Note that the 2D vorticity is equal to the ")),t("mjx-container",C1,[(e(),T("svg",O1,Q[122]||(Q[122]=[l(' ',1)]))),Q[123]||(Q[123]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"x"),t("mn",null,"3")])])],-1))]),Q[125]||(Q[125]=a("-component of the 3D vorticity."))]),Q[153]||(Q[153]=t("h3",{id:"Stream-function",tabindex:"-1"},[a("Stream function "),t("a",{class:"header-anchor",href:"#Stream-function","aria-label":'Permalink to "Stream function {#Stream-function}"'},"")],-1)),t("p",null,[Q[128]||(Q[128]=a("In 2D, the stream function ")),t("mjx-container",R1,[(e(),T("svg",B1,Q[126]||(Q[126]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D713",d:"M161 441Q202 441 226 417T250 358Q250 338 218 252T187 127Q190 85 214 61Q235 43 257 37Q275 29 288 29H289L371 360Q455 691 456 692Q459 694 472 694Q492 694 492 687Q492 678 411 356Q329 28 329 27T335 26Q421 26 498 114T576 278Q576 302 568 319T550 343T532 361T524 384Q524 405 541 424T583 443Q602 443 618 425T634 366Q634 337 623 288T605 220Q573 125 492 57T329 -11H319L296 -104Q272 -198 272 -199Q270 -205 252 -205H239Q233 -199 233 -197Q233 -192 256 -102T279 -9Q272 -8 265 -8Q106 14 106 139Q106 174 139 264T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 299 34 333T82 404T161 441Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[127]||(Q[127]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"ψ")])],-1))]),Q[129]||(Q[129]=a(" is a scalar field such that"))]),t("mjx-container",S1,[(e(),T("svg",z1,Q[130]||(Q[130]=[l(' ',1)]))),Q[131]||(Q[131]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msup",null,[t("mi",null,"u"),t("mn",null,"1")]),t("mo",null,"="),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("mi",null,"ψ")]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"2")])])]),t("mo",null,","),t("mstyle",{scriptlevel:"0"},[t("mspace",{width:"1em"})]),t("msup",null,[t("mi",null,"u"),t("mn",null,"2")]),t("mo",null,"="),t("mo",null,"−"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("mi",null,"ψ")]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"1")])])]),t("mo",null,".")])],-1))]),Q[154]||(Q[154]=t("p",null,"It can be found by solving",-1)),t("mjx-container",J1,[(e(),T("svg",G1,Q[132]||(Q[132]=[l(' ',1)]))),Q[133]||(Q[133]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msup",null,[t("mi",{mathvariant:"normal"},"∇"),t("mn",null,"2")]),t("mi",null,"ψ"),t("mo",null,"="),t("mo",null,"−"),t("mi",null,"ω"),t("mo",null,".")])],-1))]),Q[155]||(Q[155]=t("p",null,"In 3D, the stream function is a vector field such that",-1)),t("mjx-container",A1,[(e(),T("svg",P1,Q[134]||(Q[134]=[l(' ',1)]))),Q[135]||(Q[135]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"u"),t("mo",null,"="),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"×"),t("mi",null,"ψ"),t("mo",null,".")])],-1))]),Q[156]||(Q[156]=t("p",null,"It can be found by solving",-1)),t("mjx-container",X1,[(e(),T("svg",F1,Q[136]||(Q[136]=[l(' ',1)]))),Q[137]||(Q[137]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msup",null,[t("mi",{mathvariant:"normal"},"∇"),t("mn",null,"2")]),t("mi",null,"ψ"),t("mo",null,"="),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"×"),t("mi",null,"ω"),t("mo",null,".")])],-1))])])}const Y1=s(o,[["render",N1]]);export{U1 as __pageData,Y1 as default};
diff --git a/previews/PR126/assets/manual_ns.md.Bdh0AlV6.lean.js b/previews/PR126/assets/manual_ns.md.Bdh0AlV6.lean.js
new file mode 100644
index 00000000..c7aff7e0
--- /dev/null
+++ b/previews/PR126/assets/manual_ns.md.Bdh0AlV6.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as T,j as t,a,a5 as l,o as e}from"./chunks/framework.BSoZtefh.js";const U1=JSON.parse('{"title":"Incompressible Navier-Stokes equations","description":"","frontmatter":{},"headers":[],"relativePath":"manual/ns.md","filePath":"manual/ns.md","lastUpdated":null}'),o={name:"manual/ns.md"},n={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.279ex"},xmlns:"http://www.w3.org/2000/svg",width:"36.051ex",height:"7.69ex",role:"img",focusable:"false",viewBox:"0 -1949.5 15934.4 3399","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.304ex",height:"2.022ex",role:"img",focusable:"false",viewBox:"0 -853.7 3228.3 893.7","aria-hidden":"true"},i={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.473ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4187.2 1000","aria-hidden":"true"},p={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.708ex",height:"2.497ex",role:"img",focusable:"false",viewBox:"0 -853.7 6942.8 1103.7","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.138ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 503 636","aria-hidden":"true"},x={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.199ex",height:"1ex",role:"img",focusable:"false",viewBox:"0 -442 530 442","aria-hidden":"true"},H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.798ex",height:"2.497ex",role:"img",focusable:"false",viewBox:"0 -853.7 6982.8 1103.7","aria-hidden":"true"},L={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.708ex",height:"2.497ex",role:"img",focusable:"false",viewBox:"0 -853.7 6942.8 1103.7","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.817ex",height:"1.441ex",role:"img",focusable:"false",viewBox:"0 -626 361 637","aria-hidden":"true"},V={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Z={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.633ex",height:"1.593ex",role:"img",focusable:"false",viewBox:"0 -704 722 704","aria-hidden":"true"},v={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-5.033ex"},xmlns:"http://www.w3.org/2000/svg",width:"68.204ex",height:"11.197ex",role:"img",focusable:"false",viewBox:"0 -2724.5 30146.3 4949","aria-hidden":"true"},D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.451ex",height:"1.686ex",role:"img",focusable:"false",viewBox:"0 -705 2851.6 745","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},O={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.081ex",height:"1.667ex",role:"img",focusable:"false",viewBox:"0 -715 1362 737","aria-hidden":"true"},R={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.357ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 600 453","aria-hidden":"true"},S={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},z={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.672ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 1181 705","aria-hidden":"true"},J={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},G={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.564ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.059ex",height:"2.26ex",role:"img",focusable:"false",viewBox:"0 -749.5 1352 999","aria-hidden":"true"},A={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},P={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.345ex",height:"1.708ex",role:"img",focusable:"false",viewBox:"0 -715 3246.6 755","aria-hidden":"true"},X={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.373ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.081ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -583 3571.7 747.8","aria-hidden":"true"},N={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.414ex",height:"1.538ex",role:"img",focusable:"false",viewBox:"0 -680 625 680","aria-hidden":"true"},q={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.373ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.77ex",height:"1.373ex",role:"img",focusable:"false",viewBox:"0 -442 1666.2 606.8","aria-hidden":"true"},K={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.319ex",height:"1.731ex",role:"img",focusable:"false",viewBox:"0 -683 4561 765","aria-hidden":"true"},$={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.414ex",height:"1.538ex",role:"img",focusable:"false",viewBox:"0 -680 625 680","aria-hidden":"true"},Y={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},_={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.649ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6917 1000","aria-hidden":"true"},t1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.337ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6779 1000","aria-hidden":"true"},a1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.474ex",height:"1.629ex",role:"img",focusable:"false",viewBox:"0 -680 2419.6 720","aria-hidden":"true"},e1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.281ex",height:"1.803ex",role:"img",focusable:"false",viewBox:"0 -715 4986 797","aria-hidden":"true"},s1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.029ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.17ex",height:"1.005ex",role:"img",focusable:"false",viewBox:"0 -431 517 444","aria-hidden":"true"},n1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.432ex",height:"1.692ex",role:"img",focusable:"false",viewBox:"0 -666 3727 748","aria-hidden":"true"},r1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.414ex",height:"1.538ex",role:"img",focusable:"false",viewBox:"0 -680 625 680","aria-hidden":"true"},i1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.339ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 7222 1000","aria-hidden":"true"},p1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},g1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.791ex"},xmlns:"http://www.w3.org/2000/svg",width:"31.053ex",height:"2.826ex",role:"img",focusable:"false",viewBox:"0 -899.5 13725.4 1249","aria-hidden":"true"},u1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},w1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.06ex"},xmlns:"http://www.w3.org/2000/svg",width:"52.786ex",height:"6.999ex",role:"img",focusable:"false",viewBox:"0 -1740.7 23331.5 3093.4","aria-hidden":"true"},x1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},H1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.781ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.632ex",height:"2.737ex",role:"img",focusable:"false",viewBox:"0 -864.9 3373.3 1209.9","aria-hidden":"true"},L1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.781ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.535ex",height:"2.737ex",role:"img",focusable:"false",viewBox:"0 -864.9 4656.7 1209.9","aria-hidden":"true"},k1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.202ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.008ex",height:"3.159ex",role:"img",focusable:"false",viewBox:"0 -864.9 11053.8 1396.1","aria-hidden":"true"},V1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Z1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.369ex",height:"1.731ex",role:"img",focusable:"false",viewBox:"0 -683 4583 765","aria-hidden":"true"},v1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},b1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.679ex"},xmlns:"http://www.w3.org/2000/svg",width:"18.695ex",height:"5.095ex",role:"img",focusable:"false",viewBox:"0 -1509.9 8263.1 2251.9","aria-hidden":"true"},D1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},j1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-5.011ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.567ex",height:"11.153ex",role:"img",focusable:"false",viewBox:"0 -2714.9 9090.8 4929.8","aria-hidden":"true"},C1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},O1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.91ex",role:"img",focusable:"false",viewBox:"0 -833.2 1008.6 844.2","aria-hidden":"true"},R1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.473ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -694 651 899","aria-hidden":"true"},S1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},z1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.679ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.371ex",height:"4.826ex",role:"img",focusable:"false",viewBox:"0 -1391 11214 2132.9","aria-hidden":"true"},J1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},G1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.159ex",height:"2.464ex",role:"img",focusable:"false",viewBox:"0 -883.9 4932.1 1088.9","aria-hidden":"true"},A1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},P1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.063ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -694 4890 899","aria-hidden":"true"},X1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},F1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.049ex",height:"2.464ex",role:"img",focusable:"false",viewBox:"0 -883.9 6209.6 1088.9","aria-hidden":"true"};function N1(I1,Q,q1,E1,K1,W1){return e(),T("div",null,[Q[138]||(Q[138]=t("h1",{id:"Incompressible-Navier-Stokes-equations",tabindex:"-1"},[a("Incompressible Navier-Stokes equations "),t("a",{class:"header-anchor",href:"#Incompressible-Navier-Stokes-equations","aria-label":'Permalink to "Incompressible Navier-Stokes equations {#Incompressible-Navier-Stokes-equations}"'},"")],-1)),Q[139]||(Q[139]=t("p",null,"The incompressible Navier-Stokes equations describe conservation of mass and conservation of momentum, which can be written as a divergence-free constraint and an evolution equation:",-1)),t("mjx-container",n,[(e(),T("svg",m,Q[0]||(Q[0]=[l(' ',1)]))),Q[1]||(Q[1]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"⋅"),t("mi",null,"u")]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mn",null,"0"),t("mo",null,",")])]),t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("mi",null,"u")]),t("mrow",null,[t("mi",null,"∂"),t("mi",null,"t")])]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"⋅"),t("mo",{stretchy:"false"},"("),t("mi",null,"u"),t("msup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"sans-serif"},"T")])]),t("mo",{stretchy:"false"},")")]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"∇"),t("mi",null,"p"),t("mo",null,"+"),t("mi",null,"ν"),t("msup",null,[t("mi",{mathvariant:"normal"},"∇"),t("mn",null,"2")]),t("mi",null,"u"),t("mo",null,"+"),t("mi",null,"f"),t("mo",null,",")])])])])],-1))]),t("p",null,[Q[20]||(Q[20]=a("where ")),t("mjx-container",r,[(e(),T("svg",d,Q[2]||(Q[2]=[l(' ',1)]))),Q[3]||(Q[3]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Ω"),t("mo",null,"⊂"),t("msup",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"double-struck"},"R")]),t("mi",null,"d")])])],-1))]),Q[21]||(Q[21]=a(" is the domain, ")),t("mjx-container",i,[(e(),T("svg",h,Q[4]||(Q[4]=[l(' ',1)]))),Q[5]||(Q[5]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"d"),t("mo",null,"∈"),t("mo",{fence:"false",stretchy:"false"},"{"),t("mn",null,"2"),t("mo",null,","),t("mn",null,"3"),t("mo",{fence:"false",stretchy:"false"},"}")])],-1))]),Q[22]||(Q[22]=a(" is the spatial dimension, ")),t("mjx-container",p,[(e(),T("svg",g,Q[6]||(Q[6]=[l(' ',1)]))),Q[7]||(Q[7]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"u"),t("mn",null,"1")]),t("mo",null,","),t("mo",null,"…"),t("mo",null,","),t("msup",null,[t("mi",null,"u"),t("mi",null,"d")]),t("mo",{stretchy:"false"},")")])],-1))]),Q[23]||(Q[23]=a(" is the velocity field, ")),t("mjx-container",u,[(e(),T("svg",w,Q[8]||(Q[8]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45D",d:"M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[9]||(Q[9]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"p")])],-1))]),Q[24]||(Q[24]=a(" is the pressure, ")),t("mjx-container",x,[(e(),T("svg",c,Q[10]||(Q[10]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D708",d:"M74 431Q75 431 146 436T219 442Q231 442 231 434Q231 428 185 241L137 51H140L150 55Q161 59 177 67T214 86T261 119T312 165Q410 264 445 394Q458 442 496 442Q509 442 519 434T530 411Q530 390 516 352T469 262T388 162T267 70T106 5Q81 -2 71 -2Q66 -2 59 -1T51 1Q45 5 45 11Q45 13 88 188L132 364Q133 377 125 380T86 385H65Q59 391 59 393T61 412Q65 431 74 431Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[11]||(Q[11]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"ν")])],-1))]),Q[25]||(Q[25]=a(" is the kinematic viscosity, and ")),t("mjx-container",H,[(e(),T("svg",f,Q[12]||(Q[12]=[l(' ',1)]))),Q[13]||(Q[13]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"f"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"f"),t("mn",null,"1")]),t("mo",null,","),t("mo",null,"…"),t("mo",null,","),t("msup",null,[t("mi",null,"f"),t("mi",null,"d")]),t("mo",{stretchy:"false"},")")])],-1))]),Q[26]||(Q[26]=a(" is the body force per unit of volume. The velocity, pressure, and body force are functions of the spatial coordinate ")),t("mjx-container",L,[(e(),T("svg",y,Q[14]||(Q[14]=[l(' ',1)]))),Q[15]||(Q[15]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"x"),t("mn",null,"1")]),t("mo",null,","),t("mo",null,"…"),t("mo",null,","),t("msup",null,[t("mi",null,"x"),t("mi",null,"d")]),t("mo",{stretchy:"false"},")")])],-1))]),Q[27]||(Q[27]=a(" and time ")),t("mjx-container",k,[(e(),T("svg",M,Q[16]||(Q[16]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D461",d:"M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[17]||(Q[17]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"t")])],-1))]),Q[28]||(Q[28]=a(". We assume that ")),t("mjx-container",V,[(e(),T("svg",Z,Q[18]||(Q[18]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"3A9",d:"M55 454Q55 503 75 546T127 617T197 665T272 695T337 704H352Q396 704 404 703Q527 687 596 615T666 454Q666 392 635 330T559 200T499 83V80H543Q589 81 600 83T617 93Q622 102 629 135T636 172L637 177H677V175L660 89Q645 3 644 2V0H552H488Q461 0 456 3T451 20Q451 89 499 235T548 455Q548 512 530 555T483 622T424 656T361 668Q332 668 303 658T243 626T193 560T174 456Q174 380 222 233T270 20Q270 7 263 0H77V2Q76 3 61 89L44 175V177H84L85 172Q85 171 88 155T96 119T104 93Q109 86 120 84T178 80H222V83Q206 132 162 199T87 329T55 454Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[19]||(Q[19]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Ω")])],-1))]),Q[29]||(Q[29]=a(" is a rectangular domain."))]),Q[140]||(Q[140]=t("h2",{id:"Integral-form",tabindex:"-1"},[a("Integral form "),t("a",{class:"header-anchor",href:"#Integral-form","aria-label":'Permalink to "Integral form {#Integral-form}"'},"")],-1)),Q[141]||(Q[141]=t("p",null,"The integral form of the Navier-Stokes equations is used as starting point to develop a spatial discretization:",-1)),t("mjx-container",v,[(e(),T("svg",b,Q[30]||(Q[30]=[l(' ',1)]))),Q[31]||(Q[31]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])]),t("msub",null,[t("mo",{"data-mjx-texclass":"OP"},"∫"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"∂"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")])])]),t("mi",null,"u"),t("mo",null,"⋅"),t("mi",null,"n"),t("mstyle",{scriptlevel:"0"},[t("mspace",{width:"0.167em"})]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",{mathvariant:"normal"},"Γ")]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mn",null,"0"),t("mo",null,",")])]),t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])]),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])]),t("msub",null,[t("mo",{"data-mjx-texclass":"OP"},"∫"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")])]),t("mi",null,"u"),t("mstyle",{scriptlevel:"0"},[t("mspace",{width:"0.167em"})]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",{mathvariant:"normal"},"Ω")]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])]),t("msub",null,[t("mo",{"data-mjx-texclass":"OP"},"∫"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"∂"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")])])]),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mo",null,"−"),t("mi",null,"u"),t("msup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"sans-serif"},"T")])]),t("mo",null,"−"),t("mi",null,"p"),t("mi",null,"I"),t("mo",null,"+"),t("mi",null,"ν"),t("mi",{mathvariant:"normal"},"∇"),t("mi",null,"u"),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("mo",null,"⋅"),t("mi",null,"n"),t("mstyle",{scriptlevel:"0"},[t("mspace",{width:"0.167em"})]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",{mathvariant:"normal"},"Γ"),t("mo",null,"+"),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])]),t("msub",null,[t("mo",{"data-mjx-texclass":"OP"},"∫"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")])]),t("mi",null,"f"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",{mathvariant:"normal"},"Ω"),t("mo",null,",")])])])])],-1))]),t("p",null,[Q[42]||(Q[42]=a("where ")),t("mjx-container",D,[(e(),T("svg",j,Q[32]||(Q[32]=[l(' ',1)]))),Q[33]||(Q[33]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",null,"⊂"),t("mi",{mathvariant:"normal"},"Ω")])],-1))]),Q[43]||(Q[43]=a(" is an arbitrary control volume with boundary ")),t("mjx-container",C,[(e(),T("svg",O,Q[34]||(Q[34]=[l(' ',1)]))),Q[35]||(Q[35]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"∂"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")])])],-1))]),Q[44]||(Q[44]=a(", normal ")),t("mjx-container",R,[(e(),T("svg",B,Q[36]||(Q[36]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45B",d:"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[37]||(Q[37]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"n")])],-1))]),Q[45]||(Q[45]=a(", surface element ")),t("mjx-container",S,[(e(),T("svg",z,Q[38]||(Q[38]=[l(' ',1)]))),Q[39]||(Q[39]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",{mathvariant:"normal"},"Γ")])],-1))]),Q[46]||(Q[46]=a(", and volume size ")),t("mjx-container",J,[(e(),T("svg",G,Q[40]||(Q[40]=[l(' ',1)]))),Q[41]||(Q[41]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),Q[47]||(Q[47]=a(". We have divided by the control volume sizes in the integral form."))]),Q[142]||(Q[142]=t("h2",{id:"Boundary-conditions",tabindex:"-1"},[a("Boundary conditions "),t("a",{class:"header-anchor",href:"#Boundary-conditions","aria-label":'Permalink to "Boundary conditions {#Boundary-conditions}"'},"")],-1)),t("p",null,[Q[50]||(Q[50]=a("The boundary conditions on a part of the boundary ")),t("mjx-container",A,[(e(),T("svg",P,Q[48]||(Q[48]=[l(' ',1)]))),Q[49]||(Q[49]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Γ"),t("mo",null,"⊂"),t("mi",null,"∂"),t("mi",{mathvariant:"normal"},"Ω")])],-1))]),Q[51]||(Q[51]=a(" are one or more of the following:"))]),t("ul",null,[t("li",null,[t("p",null,[Q[58]||(Q[58]=a("Dirichlet: ")),t("mjx-container",X,[(e(),T("svg",F,Q[52]||(Q[52]=[l(' ',1)]))),Q[53]||(Q[53]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u"),t("mo",null,"="),t("msub",null,[t("mi",null,"u"),t("mtext",null,"BC")])])],-1))]),Q[59]||(Q[59]=a(" on ")),t("mjx-container",N,[(e(),T("svg",I,Q[54]||(Q[54]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"393",d:"M128 619Q121 626 117 628T101 631T58 634H25V680H554V676Q556 670 568 560T582 444V440H542V444Q542 445 538 478T523 545T492 598Q454 634 349 634H334Q264 634 249 633T233 621Q232 618 232 339L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[55]||(Q[55]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Γ")])],-1))]),Q[60]||(Q[60]=a(" for some ")),t("mjx-container",q,[(e(),T("svg",E,Q[56]||(Q[56]=[l(' ',1)]))),Q[57]||(Q[57]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mtext",null,"BC")])])],-1))]),Q[61]||(Q[61]=a(";"))])]),t("li",null,[t("p",null,[Q[66]||(Q[66]=a("Neumann: ")),t("mjx-container",K,[(e(),T("svg",W,Q[62]||(Q[62]=[l(' ',1)]))),Q[63]||(Q[63]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"∇"),t("mi",null,"u"),t("mo",null,"⋅"),t("mi",null,"n"),t("mo",null,"="),t("mn",null,"0")])],-1))]),Q[67]||(Q[67]=a(" on ")),t("mjx-container",$,[(e(),T("svg",U,Q[64]||(Q[64]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"393",d:"M128 619Q121 626 117 628T101 631T58 634H25V680H554V676Q556 670 568 560T582 444V440H542V444Q542 445 538 478T523 545T492 598Q454 634 349 634H334Q264 634 249 633T233 621Q232 618 232 339L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[65]||(Q[65]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Γ")])],-1))]),Q[68]||(Q[68]=a(";"))])]),t("li",null,[t("p",null,[Q[79]||(Q[79]=a("Periodic: ")),t("mjx-container",Y,[(e(),T("svg",_,Q[69]||(Q[69]=[l(' ',1)]))),Q[70]||(Q[70]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("mi",null,"x"),t("mo",{stretchy:"false"},")"),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"τ"),t("mo",{stretchy:"false"},")")])],-1))]),Q[80]||(Q[80]=a(" and ")),t("mjx-container",t1,[(e(),T("svg",Q1,Q[71]||(Q[71]=[l(' ',1)]))),Q[72]||(Q[72]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"p"),t("mo",{stretchy:"false"},"("),t("mi",null,"x"),t("mo",{stretchy:"false"},")"),t("mo",null,"="),t("mi",null,"p"),t("mo",{stretchy:"false"},"("),t("mi",null,"x"),t("mo",null,"+"),t("mi",null,"τ"),t("mo",{stretchy:"false"},")")])],-1))]),Q[81]||(Q[81]=a(" for ")),t("mjx-container",a1,[(e(),T("svg",T1,Q[73]||(Q[73]=[l(' ',1)]))),Q[74]||(Q[74]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"x"),t("mo",null,"∈"),t("mi",{mathvariant:"normal"},"Γ")])],-1))]),Q[82]||(Q[82]=a(", where ")),t("mjx-container",e1,[(e(),T("svg",l1,Q[75]||(Q[75]=[l(' ',1)]))),Q[76]||(Q[76]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Γ"),t("mo",null,"+"),t("mi",null,"τ"),t("mo",null,"⊂"),t("mi",null,"∂"),t("mi",{mathvariant:"normal"},"Ω")])],-1))]),Q[83]||(Q[83]=a(" is another part of the boundary and ")),t("mjx-container",s1,[(e(),T("svg",o1,Q[77]||(Q[77]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D70F",d:"M39 284Q18 284 18 294Q18 301 45 338T99 398Q134 425 164 429Q170 431 332 431Q492 431 497 429Q517 424 517 402Q517 388 508 376T485 360Q479 358 389 358T299 356Q298 355 283 274T251 109T233 20Q228 5 215 -4T186 -13Q153 -13 153 20V30L203 192Q214 228 227 272T248 336L254 357Q254 358 208 358Q206 358 197 358T183 359Q105 359 61 295Q56 287 53 286T39 284Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[78]||(Q[78]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"τ")])],-1))]),Q[84]||(Q[84]=a(" is a translation vector;"))])]),t("li",null,[t("p",null,[Q[91]||(Q[91]=a("Stress free: ")),t("mjx-container",n1,[(e(),T("svg",m1,Q[85]||(Q[85]=[l(' ',1)]))),Q[86]||(Q[86]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"σ"),t("mo",null,"⋅"),t("mi",null,"n"),t("mo",null,"="),t("mn",null,"0")])],-1))]),Q[92]||(Q[92]=a(" on ")),t("mjx-container",r1,[(e(),T("svg",d1,Q[87]||(Q[87]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"393",d:"M128 619Q121 626 117 628T101 631T58 634H25V680H554V676Q556 670 568 560T582 444V440H542V444Q542 445 538 478T523 545T492 598Q454 634 349 634H334Q264 634 249 633T233 621Q232 618 232 339L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[88]||(Q[88]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Γ")])],-1))]),Q[93]||(Q[93]=a(", where ")),t("mjx-container",i1,[(e(),T("svg",h1,Q[89]||(Q[89]=[l(' ',1)]))),Q[90]||(Q[90]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"σ"),t("mo",null,"="),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mo",null,"−"),t("mi",null,"p"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"I")]),t("mo",null,"+"),t("mn",null,"2"),t("mi",null,"ν"),t("mi",null,"S"),t("mo",{"data-mjx-texclass":"CLOSE"},")")])])],-1))]),Q[94]||(Q[94]=a("."))])])]),Q[143]||(Q[143]=t("h2",{id:"Pressure-equation",tabindex:"-1"},[a("Pressure equation "),t("a",{class:"header-anchor",href:"#Pressure-equation","aria-label":'Permalink to "Pressure equation {#Pressure-equation}"'},"")],-1)),Q[144]||(Q[144]=t("p",null,"Taking the divergence of the momemtum equations yields a Poisson equation for the pressure:",-1)),t("mjx-container",p1,[(e(),T("svg",g1,Q[95]||(Q[95]=[l(' ',1)]))),Q[96]||(Q[96]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mo",null,"−"),t("msup",null,[t("mi",{mathvariant:"normal"},"∇"),t("mn",null,"2")]),t("mi",null,"p"),t("mo",null,"="),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"⋅"),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"⋅"),t("mo",{stretchy:"false"},"("),t("mi",null,"u"),t("msup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"sans-serif"},"T")])]),t("mo",{stretchy:"false"},")"),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"⋅"),t("mi",null,"f")])],-1))]),Q[145]||(Q[145]=t("p",null,"In scalar notation, this becomes",-1)),t("mjx-container",u1,[(e(),T("svg",w1,Q[97]||(Q[97]=[l(' ',1)]))),Q[98]||(Q[98]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mo",null,"−"),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"α"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"d")]),t("mfrac",null,[t("msup",null,[t("mi",null,"∂"),t("mn",null,"2")]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"α")]),t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"α")])])]),t("mi",null,"p"),t("mo",null,"="),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"α"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"d")]),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"β"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"d")]),t("mfrac",null,[t("msup",null,[t("mi",null,"∂"),t("mn",null,"2")]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"α")]),t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"β")])])]),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"u"),t("mi",null,"α")]),t("msup",null,[t("mi",null,"u"),t("mi",null,"β")]),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"α"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"d")]),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"f"),t("mi",null,"α")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"α")])])]),t("mo",null,".")])],-1))]),Q[146]||(Q[146]=t("p",null,"Note the absence of time derivatives in the pressure equation. While the velocity field evolves in time, the pressure only changes such that the velocity stays divergence free.",-1)),t("p",null,[Q[101]||(Q[101]=a("If there are no pressure boundary conditions, the pressure is only unique up to a constant. We set this constant to ")),t("mjx-container",x1,[(e(),T("svg",c1,Q[99]||(Q[99]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mn"},[t("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[100]||(Q[100]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"1")])],-1))]),Q[102]||(Q[102]=a("."))]),Q[147]||(Q[147]=t("h2",{id:"Other-quantities-of-interest",tabindex:"-1"},[a("Other quantities of interest "),t("a",{class:"header-anchor",href:"#Other-quantities-of-interest","aria-label":'Permalink to "Other quantities of interest {#Other-quantities-of-interest}"'},"")],-1)),Q[148]||(Q[148]=t("h3",{id:"Reynolds-number",tabindex:"-1"},[a("Reynolds number "),t("a",{class:"header-anchor",href:"#Reynolds-number","aria-label":'Permalink to "Reynolds number {#Reynolds-number}"'},"")],-1)),t("p",null,[Q[105]||(Q[105]=a("The Reynolds number is the inverse of the viscosity: ")),t("mjx-container",H1,[(e(),T("svg",f1,Q[103]||(Q[103]=[l(' ',1)]))),Q[104]||(Q[104]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"R"),t("mi",null,"e"),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mi",null,"ν")])])],-1))]),Q[106]||(Q[106]=a(". It is the only flow parameter governing the incompressible Navier-Stokes equations."))]),Q[149]||(Q[149]=t("h3",{id:"Kinetic-energy",tabindex:"-1"},[a("Kinetic energy "),t("a",{class:"header-anchor",href:"#Kinetic-energy","aria-label":'Permalink to "Kinetic energy {#Kinetic-energy}"'},"")],-1)),t("p",null,[Q[111]||(Q[111]=a("The local and total kinetic energy are defined by ")),t("mjx-container",L1,[(e(),T("svg",y1,Q[107]||(Q[107]=[l(' ',1)]))),Q[108]||(Q[108]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"k"),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")]),t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mi",null,"u"),t("msubsup",null,[t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mn",null,"2"),t("mn",null,"2")])])],-1))]),Q[112]||(Q[112]=a(" and ")),t("mjx-container",k1,[(e(),T("svg",M1,Q[109]||(Q[109]=[l(' ',1)]))),Q[110]||(Q[110]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"K"),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")]),t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mi",null,"u"),t("msubsup",null,[t("mo",{"data-mjx-texclass":"ORD"},"∥"),t("mrow",{"data-mjx-texclass":"ORD"},[t("msup",null,[t("mi",null,"L"),t("mn",null,"2")]),t("mo",{stretchy:"false"},"("),t("mi",{mathvariant:"normal"},"Ω"),t("mo",{stretchy:"false"},")")]),t("mn",null,"2")]),t("mo",null,"="),t("msub",null,[t("mo",{"data-mjx-texclass":"OP"},"∫"),t("mi",{mathvariant:"normal"},"Ω")]),t("mi",null,"k"),t("mstyle",{scriptlevel:"0"},[t("mspace",{width:"0.167em"})]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",{mathvariant:"normal"},"Ω")])],-1))]),Q[113]||(Q[113]=a("."))]),Q[150]||(Q[150]=t("h3",{id:"vorticity",tabindex:"-1"},[a("Vorticity "),t("a",{class:"header-anchor",href:"#vorticity","aria-label":'Permalink to "Vorticity"'},"")],-1)),t("p",null,[Q[116]||(Q[116]=a("The vorticity is defined as ")),t("mjx-container",V1,[(e(),T("svg",Z1,Q[114]||(Q[114]=[l(' ',1)]))),Q[115]||(Q[115]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"ω"),t("mo",null,"="),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"×"),t("mi",null,"u")])],-1))]),Q[117]||(Q[117]=a("."))]),Q[151]||(Q[151]=t("p",null,"In 2D, it is a scalar field given by",-1)),t("mjx-container",v1,[(e(),T("svg",b1,Q[118]||(Q[118]=[l(' ',1)]))),Q[119]||(Q[119]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"ω"),t("mo",null,"="),t("mo",null,"−"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"1")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"2")])])]),t("mo",null,"+"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"2")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"1")])])]),t("mo",null,".")])],-1))]),Q[152]||(Q[152]=t("p",null,"In 3D, it is a vector field given by",-1)),t("mjx-container",D1,[(e(),T("svg",j1,Q[120]||(Q[120]=[l(' ',1)]))),Q[121]||(Q[121]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"ω"),t("mo",null,"="),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mtable",{columnspacing:"1em",rowspacing:"4pt"},[t("mtr",null,[t("mtd",null,[t("mo",null,"−"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"2")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"3")])])]),t("mo",null,"+"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"3")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"2")])])])])]),t("mtr",null,[t("mtd",null,[t("mo",null,"−"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"3")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"1")])])]),t("mo",null,"+"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"1")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"3")])])])])]),t("mtr",null,[t("mtd",null,[t("mo",null,"−"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"1")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"2")])])]),t("mo",null,"+"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mn",null,"2")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"1")])])])])])]),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("mo",null,".")])],-1))]),t("p",null,[Q[124]||(Q[124]=a("Note that the 2D vorticity is equal to the ")),t("mjx-container",C1,[(e(),T("svg",O1,Q[122]||(Q[122]=[l(' ',1)]))),Q[123]||(Q[123]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"x"),t("mn",null,"3")])])],-1))]),Q[125]||(Q[125]=a("-component of the 3D vorticity."))]),Q[153]||(Q[153]=t("h3",{id:"Stream-function",tabindex:"-1"},[a("Stream function "),t("a",{class:"header-anchor",href:"#Stream-function","aria-label":'Permalink to "Stream function {#Stream-function}"'},"")],-1)),t("p",null,[Q[128]||(Q[128]=a("In 2D, the stream function ")),t("mjx-container",R1,[(e(),T("svg",B1,Q[126]||(Q[126]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D713",d:"M161 441Q202 441 226 417T250 358Q250 338 218 252T187 127Q190 85 214 61Q235 43 257 37Q275 29 288 29H289L371 360Q455 691 456 692Q459 694 472 694Q492 694 492 687Q492 678 411 356Q329 28 329 27T335 26Q421 26 498 114T576 278Q576 302 568 319T550 343T532 361T524 384Q524 405 541 424T583 443Q602 443 618 425T634 366Q634 337 623 288T605 220Q573 125 492 57T329 -11H319L296 -104Q272 -198 272 -199Q270 -205 252 -205H239Q233 -199 233 -197Q233 -192 256 -102T279 -9Q272 -8 265 -8Q106 14 106 139Q106 174 139 264T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 299 34 333T82 404T161 441Z",style:{"stroke-width":"3"}})])])],-1)]))),Q[127]||(Q[127]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"ψ")])],-1))]),Q[129]||(Q[129]=a(" is a scalar field such that"))]),t("mjx-container",S1,[(e(),T("svg",z1,Q[130]||(Q[130]=[l(' ',1)]))),Q[131]||(Q[131]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msup",null,[t("mi",null,"u"),t("mn",null,"1")]),t("mo",null,"="),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("mi",null,"ψ")]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"2")])])]),t("mo",null,","),t("mstyle",{scriptlevel:"0"},[t("mspace",{width:"1em"})]),t("msup",null,[t("mi",null,"u"),t("mn",null,"2")]),t("mo",null,"="),t("mo",null,"−"),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("mi",null,"ψ")]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mn",null,"1")])])]),t("mo",null,".")])],-1))]),Q[154]||(Q[154]=t("p",null,"It can be found by solving",-1)),t("mjx-container",J1,[(e(),T("svg",G1,Q[132]||(Q[132]=[l(' ',1)]))),Q[133]||(Q[133]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msup",null,[t("mi",{mathvariant:"normal"},"∇"),t("mn",null,"2")]),t("mi",null,"ψ"),t("mo",null,"="),t("mo",null,"−"),t("mi",null,"ω"),t("mo",null,".")])],-1))]),Q[155]||(Q[155]=t("p",null,"In 3D, the stream function is a vector field such that",-1)),t("mjx-container",A1,[(e(),T("svg",P1,Q[134]||(Q[134]=[l(' ',1)]))),Q[135]||(Q[135]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"u"),t("mo",null,"="),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"×"),t("mi",null,"ψ"),t("mo",null,".")])],-1))]),Q[156]||(Q[156]=t("p",null,"It can be found by solving",-1)),t("mjx-container",X1,[(e(),T("svg",F1,Q[136]||(Q[136]=[l(' ',1)]))),Q[137]||(Q[137]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msup",null,[t("mi",{mathvariant:"normal"},"∇"),t("mn",null,"2")]),t("mi",null,"ψ"),t("mo",null,"="),t("mi",{mathvariant:"normal"},"∇"),t("mo",null,"×"),t("mi",null,"ω"),t("mo",null,".")])],-1))])])}const Y1=s(o,[["render",N1]]);export{U1 as __pageData,Y1 as default};
diff --git a/previews/PR126/assets/manual_operators.md.CrXXLMhT.js b/previews/PR126/assets/manual_operators.md.CrXXLMhT.js
new file mode 100644
index 00000000..9fb21ca5
--- /dev/null
+++ b/previews/PR126/assets/manual_operators.md.CrXXLMhT.js
@@ -0,0 +1,6 @@
+import{_ as Q,c as n,a5 as a,j as t,a as s,G as i,B as r,o}from"./chunks/framework.BSoZtefh.js";const l2=JSON.parse('{"title":"Operators","description":"","frontmatter":{},"headers":[],"relativePath":"manual/operators.md","filePath":"manual/operators.md","lastUpdated":null}'),T={name:"manual/operators.md"},d={class:"jldocstring custom-block",open:""},p={class:"jldocstring custom-block",open:""},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.873ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 828 683","aria-hidden":"true"},g={class:"jldocstring custom-block",open:""},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.873ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 828 683","aria-hidden":"true"},c={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.068ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.927ex",height:"5.369ex",role:"img",focusable:"false",viewBox:"0 -1459 5271.6 2372.9","aria-hidden":"true"},y={class:"jldocstring custom-block",open:""},f={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},v={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.79ex",height:"2.032ex",role:"img",focusable:"false",viewBox:"0 -704 791 898","aria-hidden":"true"},x={class:"jldocstring custom-block",open:""},w={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.79ex",height:"2.032ex",role:"img",focusable:"false",viewBox:"0 -704 791 898","aria-hidden":"true"},H={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},L={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.06ex"},xmlns:"http://www.w3.org/2000/svg",width:"22.907ex",height:"6.539ex",role:"img",focusable:"false",viewBox:"0 -1537.5 10125 2890.2","aria-hidden":"true"},E={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},z={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},P={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.666ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.662ex",height:"2.363ex",role:"img",focusable:"false",viewBox:"0 -750 4270.6 1044.2","aria-hidden":"true"},X={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},$={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.034ex",height:"2.072ex",role:"img",focusable:"false",viewBox:"0 -833.9 3551.2 915.9","aria-hidden":"true"},Y={class:"jldocstring custom-block",open:""},_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},t1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.034ex",height:"2.072ex",role:"img",focusable:"false",viewBox:"0 -833.9 3551.2 915.9","aria-hidden":"true"},e1={class:"jldocstring custom-block",open:""},s1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},a1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.669ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.359ex",height:"2.69ex",role:"img",focusable:"false",viewBox:"0 -893.3 6788.6 1189","aria-hidden":"true"},l1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},i1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.666ex"},xmlns:"http://www.w3.org/2000/svg",width:"13.598ex",height:"2.363ex",role:"img",focusable:"false",viewBox:"0 -750 6010.1 1044.2","aria-hidden":"true"},n1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.114ex",height:"3.023ex",role:"img",focusable:"false",viewBox:"0 -983.2 4912.3 1336","aria-hidden":"true"},Q1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.253ex",height:"2.819ex",role:"img",focusable:"false",viewBox:"0 -893.3 6742 1246.1","aria-hidden":"true"},T1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.334ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.614ex",height:"3.686ex",role:"img",focusable:"false",viewBox:"0 -1039.8 5133.2 1629.3","aria-hidden":"true"},p1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.482ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.29ex",height:"3.851ex",role:"img",focusable:"false",viewBox:"0 -1047.1 8968.4 1702.1","aria-hidden":"true"},h1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.254ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.959ex",height:"3.238ex",role:"img",focusable:"false",viewBox:"0 -877 3517.7 1431","aria-hidden":"true"},u1={class:"jldocstring custom-block",open:""},k1={class:"jldocstring custom-block",open:""},c1={class:"jldocstring custom-block",open:""},b1={class:"jldocstring custom-block",open:""},y1={class:"jldocstring custom-block",open:""},f1={class:"jldocstring custom-block",open:""},v1={class:"jldocstring custom-block",open:""},x1={class:"jldocstring custom-block",open:""},w1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},H1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},L1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.619ex"},xmlns:"http://www.w3.org/2000/svg",width:"27.725ex",height:"5.656ex",role:"img",focusable:"false",viewBox:"0 -1342 12254.6 2499.8","aria-hidden":"true"},E1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},M1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.619ex"},xmlns:"http://www.w3.org/2000/svg",width:"32.233ex",height:"5.656ex",role:"img",focusable:"false",viewBox:"0 -1342 14247.1 2499.8","aria-hidden":"true"},A1={class:"jldocstring custom-block",open:""},C1={class:"jldocstring custom-block",open:""},V1={class:"jldocstring custom-block",open:""},Z1={class:"jldocstring custom-block",open:""},S1={class:"jldocstring custom-block",open:""},N1={class:"jldocstring custom-block",open:""},I1={class:"jldocstring custom-block",open:""},D1={class:"jldocstring custom-block",open:""},F1={class:"jldocstring custom-block",open:""},O1={class:"jldocstring custom-block",open:""},B1={class:"jldocstring custom-block",open:""},R1={class:"jldocstring custom-block",open:""},G1={class:"jldocstring custom-block",open:""},J1={class:"jldocstring custom-block",open:""},z1={class:"jldocstring custom-block",open:""},P1={class:"jldocstring custom-block",open:""},X1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.309ex",height:"1.906ex",role:"img",focusable:"false",viewBox:"0 -677 1020.6 842.6","aria-hidden":"true"},K1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.14ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 504 683","aria-hidden":"true"},$1={class:"jldocstring custom-block",open:""};function W1(Y1,e,_1,t2,e2,s2){const l=r("Badge");return o(),n("div",null,[e[262]||(e[262]=a('Operators All discrete operators are built using KernelAbstractions.jl and Cartesian indices, similar to WaterLily.jl . This allows for dimension- and backend-agnostic code. See this blog post for how to write kernels. IncompressibleNavierStokes previously relied on assembling sparse operators to perform the same operations. While being very efficient and also compatible with CUDA (CUSPARSE), storing these matrices in memory is expensive for large 3D problems.
',2)),t("details",d,[t("summary",null,[e[0]||(e[0]=t("a",{id:"IncompressibleNavierStokes.Offset",href:"#IncompressibleNavierStokes.Offset"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.Offset")],-1)),e[1]||(e[1]=s()),i(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),e[2]||(e[2]=a('Cartesian index unit vector in D = 2
or D = 3
dimensions. Calling Offset(D)(α)
returns a Cartesian index with 1
in the dimension α
and zeros elsewhere.
See https://b-fg.github.io/2023/05/07/waterlily-on-gpu.html for writing kernel loops using Cartesian indices.
Fields
source
',5))]),t("details",p,[t("summary",null,[e[3]||(e[3]=t("a",{id:"IncompressibleNavierStokes.Dfield!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.Dfield!-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.Dfield!")],-1)),e[4]||(e[4]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[9]||(e[9]=a('julia Dfield! (d, G, p, setup; ϵ) -> Any
',1)),t("p",null,[e[7]||(e[7]=s("Compute the ")),t("mjx-container",m,[(o(),n("svg",h,e[5]||(e[5]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D437",d:"M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z",style:{"stroke-width":"3"}})])])],-1)]))),e[6]||(e[6]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"D")])],-1))]),e[8]||(e[8]=s("-field (in-place version)."))]),e[10]||(e[10]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1389",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",g,[t("summary",null,[e[11]||(e[11]=t("a",{id:"IncompressibleNavierStokes.Dfield-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.Dfield-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.Dfield")],-1)),e[12]||(e[12]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[21]||(e[21]=a('julia Dfield (p, setup; kwargs ... ) -> Any
',1)),t("p",null,[e[15]||(e[15]=s("Compute the ")),t("mjx-container",u,[(o(),n("svg",k,e[13]||(e[13]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D437",d:"M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z",style:{"stroke-width":"3"}})])])],-1)]))),e[14]||(e[14]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"D")])],-1))]),e[16]||(e[16]=s("-field [")),e[17]||(e[17]=t("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#LiJiajia2019"},"5",-1)),e[18]||(e[18]=s("] given by"))]),t("mjx-container",c,[(o(),n("svg",b,e[19]||(e[19]=[a(' ',1)]))),e[20]||(e[20]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"D"),t("mo",null,"="),t("mfrac",null,[t("mrow",null,[t("mn",null,"2"),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),t("mi",{mathvariant:"normal"},"∇"),t("mi",null,"p"),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")]),t("mrow",null,[t("msup",null,[t("mi",{mathvariant:"normal"},"∇"),t("mn",null,"2")]),t("mi",null,"p")])]),t("mo",null,".")])],-1))]),e[22]||(e[22]=t("p",null,"Differentiable version.",-1)),e[23]||(e[23]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1374",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",y,[t("summary",null,[e[24]||(e[24]=t("a",{id:"IncompressibleNavierStokes.Qfield!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.Qfield!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.Qfield!")],-1)),e[25]||(e[25]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[30]||(e[30]=a('julia Qfield! (Q, u, setup) -> Any
',1)),t("p",null,[e[28]||(e[28]=s("Compute the ")),t("mjx-container",f,[(o(),n("svg",v,e[26]||(e[26]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D444",d:"M399 -80Q399 -47 400 -30T402 -11V-7L387 -11Q341 -22 303 -22Q208 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435Q740 255 592 107Q529 47 461 16L444 8V3Q444 2 449 -24T470 -66T516 -82Q551 -82 583 -60T625 -3Q631 11 638 11Q647 11 649 2Q649 -6 639 -34T611 -100T557 -165T481 -194Q399 -194 399 -87V-80ZM636 468Q636 523 621 564T580 625T530 655T477 665Q429 665 379 640Q277 591 215 464T153 216Q153 110 207 59Q231 38 236 38V46Q236 86 269 120T347 155Q372 155 390 144T417 114T429 82T435 55L448 64Q512 108 557 185T619 334T636 468ZM314 18Q362 18 404 39L403 49Q399 104 366 115Q354 117 347 117Q344 117 341 117T337 118Q317 118 296 98T274 52Q274 18 314 18Z",style:{"stroke-width":"3"}})])])],-1)]))),e[27]||(e[27]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"Q")])],-1))]),e[29]||(e[29]=s("-field (in-place version)."))]),e[31]||(e[31]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1440",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",x,[t("summary",null,[e[32]||(e[32]=t("a",{id:"IncompressibleNavierStokes.Qfield-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.Qfield-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.Qfield")],-1)),e[33]||(e[33]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[42]||(e[42]=a('julia Qfield (u, setup) -> Any
',1)),t("p",null,[e[36]||(e[36]=s("Compute ")),t("mjx-container",w,[(o(),n("svg",j,e[34]||(e[34]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D444",d:"M399 -80Q399 -47 400 -30T402 -11V-7L387 -11Q341 -22 303 -22Q208 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435Q740 255 592 107Q529 47 461 16L444 8V3Q444 2 449 -24T470 -66T516 -82Q551 -82 583 -60T625 -3Q631 11 638 11Q647 11 649 2Q649 -6 639 -34T611 -100T557 -165T481 -194Q399 -194 399 -87V-80ZM636 468Q636 523 621 564T580 625T530 655T477 665Q429 665 379 640Q277 591 215 464T153 216Q153 110 207 59Q231 38 236 38V46Q236 86 269 120T347 155Q372 155 390 144T417 114T429 82T435 55L448 64Q512 108 557 185T619 334T636 468ZM314 18Q362 18 404 39L403 49Q399 104 366 115Q354 117 347 117Q344 117 341 117T337 118Q317 118 296 98T274 52Q274 18 314 18Z",style:{"stroke-width":"3"}})])])],-1)]))),e[35]||(e[35]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"Q")])],-1))]),e[37]||(e[37]=s("-field [")),e[38]||(e[38]=t("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Jeong1995"},"6",-1)),e[39]||(e[39]=s("] given by"))]),t("mjx-container",H,[(o(),n("svg",L,e[40]||(e[40]=[a(' ',1)]))),e[41]||(e[41]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"Q"),t("mo",null,"="),t("mo",null,"−"),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")]),t("munder",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"α"),t("mo",null,","),t("mi",null,"β")])]),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mi",null,"α")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"β")])])]),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mi",null,"β")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"α")])])]),t("mo",null,".")])],-1))]),e[43]||(e[43]=t("p",null,"Differentiable version.",-1)),e[44]||(e[44]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1425",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",E,[t("summary",null,[e[45]||(e[45]=t("a",{id:"IncompressibleNavierStokes.applybodyforce!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.applybodyforce!-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.applybodyforce!")],-1)),e[46]||(e[46]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[47]||(e[47]=a('julia applybodyforce! (F, u, t, setup) -> Any
Compute body force (in-place version). Add the result to F
.
source
',3))]),t("details",M,[t("summary",null,[e[48]||(e[48]=t("a",{id:"IncompressibleNavierStokes.applybodyforce-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.applybodyforce-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.applybodyforce")],-1)),e[49]||(e[49]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[50]||(e[50]=a('julia applybodyforce (u, t, setup) -> Any
Compute body force (differentiable version).
source
',3))]),t("details",A,[t("summary",null,[e[51]||(e[51]=t("a",{id:"IncompressibleNavierStokes.applypressure!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.applypressure!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.applypressure!")],-1)),e[52]||(e[52]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[53]||(e[53]=a('julia applypressure! (u, p, setup) -> Any
Subtract pressure gradient (in-place version).
source
',3))]),t("details",C,[t("summary",null,[e[54]||(e[54]=t("a",{id:"IncompressibleNavierStokes.applypressure-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.applypressure-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.applypressure")],-1)),e[55]||(e[55]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[56]||(e[56]=a('julia applypressure (u, p, setup) -> Any
Subtract pressure gradient (differentiable version).
source
',3))]),t("details",V,[t("summary",null,[e[57]||(e[57]=t("a",{id:"IncompressibleNavierStokes.avg-NTuple{4, Any}",href:"#IncompressibleNavierStokes.avg-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.avg")],-1)),e[58]||(e[58]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[59]||(e[59]=a('julia avg (ϕ, Δ, I, α) -> Any
Average scalar field ϕ
in the α
-direction.
source
',3))]),t("details",Z,[t("summary",null,[e[60]||(e[60]=t("a",{id:"IncompressibleNavierStokes.convection!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.convection!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.convection!")],-1)),e[61]||(e[61]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[62]||(e[62]=a('julia convection! (F, u, setup) -> Any
Compute convective term (in-place version). Add the result to F
.
source
',3))]),t("details",S,[t("summary",null,[e[63]||(e[63]=t("a",{id:"IncompressibleNavierStokes.convection-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.convection-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.convection")],-1)),e[64]||(e[64]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[65]||(e[65]=a('julia convection (u, setup) -> Any
Compute convective term (differentiable version).
source
',3))]),t("details",N,[t("summary",null,[e[66]||(e[66]=t("a",{id:"IncompressibleNavierStokes.convection_diffusion_temp!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.convection_diffusion_temp!-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.convection_diffusion_temp!")],-1)),e[67]||(e[67]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[68]||(e[68]=a('julia convection_diffusion_temp! (c, u, temp, setup) -> Any
Compute convection-diffusion term for the temperature equation. (in-place version). Add result to c
.
source
',3))]),t("details",I,[t("summary",null,[e[69]||(e[69]=t("a",{id:"IncompressibleNavierStokes.convection_diffusion_temp-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.convection_diffusion_temp-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.convection_diffusion_temp")],-1)),e[70]||(e[70]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[71]||(e[71]=a('julia convection_diffusion_temp (u, temp, setup) -> Any
Compute convection-diffusion term for the temperature equation. (differentiable version).
source
',3))]),t("details",D,[t("summary",null,[e[72]||(e[72]=t("a",{id:"IncompressibleNavierStokes.convectiondiffusion!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.convectiondiffusion!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.convectiondiffusion!")],-1)),e[73]||(e[73]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[74]||(e[74]=a('julia convectiondiffusion! (F, u, setup) -> Any
Compute convective and diffusive terms (in-place version). Add the result to F
.
source
',3))]),t("details",F,[t("summary",null,[e[75]||(e[75]=t("a",{id:"IncompressibleNavierStokes.diffusion!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.diffusion!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.diffusion!")],-1)),e[76]||(e[76]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[77]||(e[77]=a('julia diffusion! (F, u, setup; use_viscosity) -> Any
Compute diffusive term (in-place version). Add the result to F
.
Keyword arguments:
with_viscosity = true
: Include viscosity in the operator.source
',5))]),t("details",O,[t("summary",null,[e[78]||(e[78]=t("a",{id:"IncompressibleNavierStokes.diffusion-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.diffusion-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.diffusion")],-1)),e[79]||(e[79]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[80]||(e[80]=a('julia diffusion (u, setup; kwargs ... ) -> Any
Compute diffusive term (differentiable version).
source
',3))]),t("details",B,[t("summary",null,[e[81]||(e[81]=t("a",{id:"IncompressibleNavierStokes.dissipation!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.dissipation!-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.dissipation!")],-1)),e[82]||(e[82]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[83]||(e[83]=a('julia dissipation! (diss, diff, u, setup) -> Any
Compute dissipation term for the temperature equation (in-place version). Add result to diss
.
source
',3))]),t("details",R,[t("summary",null,[e[84]||(e[84]=t("a",{id:"IncompressibleNavierStokes.dissipation-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.dissipation-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.dissipation")],-1)),e[85]||(e[85]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[86]||(e[86]=a('julia dissipation (u, setup) -> Any
Compute dissipation term for the temperature equation (differentiable version).
source
',3))]),t("details",G,[t("summary",null,[e[87]||(e[87]=t("a",{id:"IncompressibleNavierStokes.dissipation_from_strain!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.dissipation_from_strain!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.dissipation_from_strain!")],-1)),e[88]||(e[88]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[89]||(e[89]=a('julia dissipation_from_strain! (ϵ, u, setup) -> Any
Compute dissipation term from strain-rate tensor (in-place version).
source
',3))]),t("details",J,[t("summary",null,[e[90]||(e[90]=t("a",{id:"IncompressibleNavierStokes.dissipation_from_strain-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.dissipation_from_strain-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.dissipation_from_strain")],-1)),e[91]||(e[91]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[96]||(e[96]=a('julia dissipation_from_strain (u, setup) -> Any
',1)),t("p",null,[e[94]||(e[94]=s("Compute dissipation term ")),t("mjx-container",z,[(o(),n("svg",P,e[92]||(e[92]=[a(' ',1)]))),e[93]||(e[93]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"2"),t("mi",null,"ν"),t("mo",{fence:"false",stretchy:"false"},"⟨"),t("msub",null,[t("mi",null,"S"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("msub",null,[t("mi",null,"S"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("mo",{fence:"false",stretchy:"false"},"⟩")])],-1))]),e[95]||(e[95]=s(" from strain-rate tensor (differentiable version)."))]),e[97]||(e[97]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L810",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",X,[t("summary",null,[e[98]||(e[98]=t("a",{id:"IncompressibleNavierStokes.divergence!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.divergence!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.divergence!")],-1)),e[99]||(e[99]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[100]||(e[100]=a('julia divergence! (div, u, setup) -> Any
Compute divergence of velocity field (in-place version).
source
',3))]),t("details",q,[t("summary",null,[e[101]||(e[101]=t("a",{id:"IncompressibleNavierStokes.divergence-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.divergence-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.divergence")],-1)),e[102]||(e[102]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[103]||(e[103]=a('julia divergence (u, setup) -> Any
Compute divergence of velocity field (differentiable version).
source
',3))]),t("details",K,[t("summary",null,[e[104]||(e[104]=t("a",{id:"IncompressibleNavierStokes.divoftensor!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.divoftensor!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.divoftensor!")],-1)),e[105]||(e[105]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[106]||(e[106]=a('julia divoftensor! (s, σ, setup) -> Any
Compute divergence of a tensor with all components in the pressure points (in-place version). The stress tensors should be precomputed and stored in σ
.
source
',3))]),t("details",U,[t("summary",null,[e[107]||(e[107]=t("a",{id:"IncompressibleNavierStokes.eig2field!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.eig2field!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.eig2field!")],-1)),e[108]||(e[108]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[113]||(e[113]=a('julia eig2field! (λ, u, setup) -> Any
',1)),t("p",null,[e[111]||(e[111]=s("Compute the second eigenvalue of ")),t("mjx-container",$,[(o(),n("svg",W,e[109]||(e[109]=[a(' ',1)]))),e[110]||(e[110]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"S"),t("mn",null,"2")]),t("mo",null,"+"),t("msup",null,[t("mi",null,"R"),t("mn",null,"2")])])],-1))]),e[112]||(e[112]=s(" (in-place version)."))]),e[114]||(e[114]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1470",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",Y,[t("summary",null,[e[115]||(e[115]=t("a",{id:"IncompressibleNavierStokes.eig2field-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.eig2field-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.eig2field")],-1)),e[116]||(e[116]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[123]||(e[123]=a('julia eig2field (u, setup) -> Any
',1)),t("p",null,[e[119]||(e[119]=s("Compute the second eigenvalue of ")),t("mjx-container",_,[(o(),n("svg",t1,e[117]||(e[117]=[a(' ',1)]))),e[118]||(e[118]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"S"),t("mn",null,"2")]),t("mo",null,"+"),t("msup",null,[t("mi",null,"R"),t("mn",null,"2")])])],-1))]),e[120]||(e[120]=s(", as proposed by Jeong and Hussain [")),e[121]||(e[121]=t("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Jeong1995"},"6",-1)),e[122]||(e[122]=s("]."))]),e[124]||(e[124]=t("p",null,"Differentiable version.",-1)),e[125]||(e[125]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1462",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",e1,[t("summary",null,[e[126]||(e[126]=t("a",{id:"IncompressibleNavierStokes.get_scale_numbers-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.get_scale_numbers-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.get_scale_numbers")],-1)),e[127]||(e[127]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[149]||(e[149]=a(`julia get_scale_numbers (
+ u,
+ setup
+) -> NamedTuple{( :uavg , :ϵ , :η , :λ , :Reλ , :L , :τ ), <: Tuple{Any, Any, Any, Any, Any, Nothing, Nothing} }
Get the following dimensional scale numbers [7 ]:
`,2)),t("ul",null,[t("li",null,[t("p",null,[e[130]||(e[130]=s("Velocity ")),t("mjx-container",s1,[(o(),n("svg",a1,e[128]||(e[128]=[a(' ',1)]))),e[129]||(e[129]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mtext",null,"avg")]),t("mo",null,"="),t("mo",{fence:"false",stretchy:"false"},"⟨"),t("msub",null,[t("mi",null,"u"),t("mi",null,"i")]),t("msub",null,[t("mi",null,"u"),t("mi",null,"i")]),t("msup",null,[t("mo",{fence:"false",stretchy:"false"},"⟩"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mn",null,"1"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"/")]),t("mn",null,"2")])])])],-1))])])]),t("li",null,[t("p",null,[e[133]||(e[133]=s("Dissipation rate ")),t("mjx-container",l1,[(o(),n("svg",i1,e[131]||(e[131]=[a(' ',1)]))),e[132]||(e[132]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"ϵ"),t("mo",null,"="),t("mn",null,"2"),t("mi",null,"ν"),t("mo",{fence:"false",stretchy:"false"},"⟨"),t("msub",null,[t("mi",null,"S"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("msub",null,[t("mi",null,"S"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("mo",{fence:"false",stretchy:"false"},"⟩")])],-1))])])]),t("li",null,[t("p",null,[e[136]||(e[136]=s("Kolmolgorov length scale ")),t("mjx-container",n1,[(o(),n("svg",o1,e[134]||(e[134]=[a(' ',1)]))),e[135]||(e[135]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"η"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("mfrac",null,[t("msup",null,[t("mi",null,"ν"),t("mn",null,"3")]),t("mi",null,"ϵ")]),t("msup",null,[t("mo",{stretchy:"false"},")"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mn",null,"1"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"/")]),t("mn",null,"4")])])])],-1))])])]),t("li",null,[t("p",null,[e[139]||(e[139]=s("Taylor length scale ")),t("mjx-container",Q1,[(o(),n("svg",r1,e[137]||(e[137]=[a(' ',1)]))),e[138]||(e[138]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"λ"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("mfrac",null,[t("mrow",null,[t("mn",null,"5"),t("mi",null,"ν")]),t("mi",null,"ϵ")]),t("msup",null,[t("mo",{stretchy:"false"},")"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mn",null,"1"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"/")]),t("mn",null,"2")])]),t("msub",null,[t("mi",null,"u"),t("mtext",null,"avg")])])],-1))])])]),t("li",null,[t("p",null,[e[142]||(e[142]=s("Taylor-scale Reynolds number ")),t("mjx-container",T1,[(o(),n("svg",d1,e[140]||(e[140]=[a(' ',1)]))),e[141]||(e[141]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"R"),t("msub",null,[t("mi",null,"e"),t("mi",null,"λ")]),t("mo",null,"="),t("mfrac",null,[t("mrow",null,[t("mi",null,"λ"),t("msub",null,[t("mi",null,"u"),t("mtext",null,"avg")])]),t("mrow",null,[t("msqrt",null,[t("mn",null,"3")]),t("mi",null,"ν")])])])],-1))])])]),t("li",null,[t("p",null,[e[145]||(e[145]=s("Integral length scale ")),t("mjx-container",p1,[(o(),n("svg",m1,e[143]||(e[143]=[a(' ',1)]))),e[144]||(e[144]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"L"),t("mo",null,"="),t("mfrac",null,[t("mrow",null,[t("mn",null,"3"),t("mi",null,"π")]),t("mrow",null,[t("mn",null,"2"),t("msubsup",null,[t("mi",null,"u"),t("mtext",null,"avg"),t("mn",null,"2")])])]),t("msubsup",null,[t("mo",{"data-mjx-texclass":"OP"},"∫"),t("mn",null,"0"),t("mi",{mathvariant:"normal"},"∞")]),t("mfrac",null,[t("mrow",null,[t("mi",null,"E"),t("mo",{stretchy:"false"},"("),t("mi",null,"k"),t("mo",{stretchy:"false"},")")]),t("mi",null,"k")]),t("mstyle",{scriptlevel:"0"},[t("mspace",{width:"0.167em"})]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"k")])],-1))])])]),t("li",null,[t("p",null,[e[148]||(e[148]=s("Large-eddy turnover time ")),t("mjx-container",h1,[(o(),n("svg",g1,e[146]||(e[146]=[a(' ',1)]))),e[147]||(e[147]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"τ"),t("mo",null,"="),t("mfrac",null,[t("mi",null,"L"),t("msub",null,[t("mi",null,"u"),t("mtext",null,"avg")])])])],-1))])])])]),e[150]||(e[150]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1558",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",u1,[t("summary",null,[e[151]||(e[151]=t("a",{id:"IncompressibleNavierStokes.gravity!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.gravity!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.gravity!")],-1)),e[152]||(e[152]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[153]||(e[153]=a('julia gravity! (F, temp, setup) -> Any
Compute gravity term (in-place version). add the result to F
.
source
',3))]),t("details",k1,[t("summary",null,[e[154]||(e[154]=t("a",{id:"IncompressibleNavierStokes.gravity-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.gravity-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.gravity")],-1)),e[155]||(e[155]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[156]||(e[156]=a('julia gravity (temp, setup) -> Any
Compute gravity term (differentiable version).
source
',3))]),t("details",c1,[t("summary",null,[e[157]||(e[157]=t("a",{id:"IncompressibleNavierStokes.interpolate_u_p!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.interpolate_u_p!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.interpolate_u_p!")],-1)),e[158]||(e[158]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[159]||(e[159]=a('julia interpolate_u_p! (up, u, setup) -> Any
Interpolate velocity to pressure points (in-place version).
source
',3))]),t("details",b1,[t("summary",null,[e[160]||(e[160]=t("a",{id:"IncompressibleNavierStokes.interpolate_u_p-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.interpolate_u_p-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.interpolate_u_p")],-1)),e[161]||(e[161]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[162]||(e[162]=a('julia interpolate_u_p (u, setup) -> Any
Interpolate velocity to pressure points (differentiable version).
source
',3))]),t("details",y1,[t("summary",null,[e[163]||(e[163]=t("a",{id:"IncompressibleNavierStokes.interpolate_ω_p!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.interpolate_ω_p!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.interpolate_ω_p!")],-1)),e[164]||(e[164]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[165]||(e[165]=a('julia interpolate_ω_p! (ωp, ω, setup) -> Any
Interpolate vorticity to pressure points (in-place version).
source
',3))]),t("details",f1,[t("summary",null,[e[166]||(e[166]=t("a",{id:"IncompressibleNavierStokes.interpolate_ω_p-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.interpolate_ω_p-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.interpolate_ω_p")],-1)),e[167]||(e[167]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[168]||(e[168]=a('julia interpolate_ω_p (ω, setup) -> Any
Interpolate vorticity to pressure points (differentiable version).
source
',3))]),t("details",v1,[t("summary",null,[e[169]||(e[169]=t("a",{id:"IncompressibleNavierStokes.kinetic_energy!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.kinetic_energy!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.kinetic_energy!")],-1)),e[170]||(e[170]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[171]||(e[171]=a('julia kinetic_energy! (ke, u, setup; interpolate_first) -> Any
Compute kinetic energy field (in-place version).
source
',3))]),t("details",x1,[t("summary",null,[e[172]||(e[172]=t("a",{id:"IncompressibleNavierStokes.kinetic_energy-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.kinetic_energy-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.kinetic_energy")],-1)),e[173]||(e[173]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[184]||(e[184]=a('julia kinetic_energy (u, setup; kwargs ... ) -> Any
',1)),t("p",null,[e[176]||(e[176]=s("Compute kinetic energy field ")),t("mjx-container",w1,[(o(),n("svg",j1,e[174]||(e[174]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1)]))),e[175]||(e[175]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"k")])],-1))]),e[177]||(e[177]=s(" (in-place version). If ")),e[178]||(e[178]=t("code",null,"interpolate_first",-1)),e[179]||(e[179]=s(" is true, it is given by"))]),t("mjx-container",H1,[(o(),n("svg",L1,e[180]||(e[180]=[a(' ',1)]))),e[181]||(e[181]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msub",null,[t("mi",null,"k"),t("mi",null,"I")]),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"8")]),t("munder",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mi",null,"α")]),t("mo",{stretchy:"false"},"("),t("msubsup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"I"),t("mo",null,"+"),t("msub",null,[t("mi",null,"h"),t("mi",null,"α")])]),t("mi",null,"α")]),t("mo",null,"+"),t("msubsup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"I"),t("mo",null,"−"),t("msub",null,[t("mi",null,"h"),t("mi",null,"α")])]),t("mi",null,"α")]),t("msup",null,[t("mo",{stretchy:"false"},")"),t("mn",null,"2")]),t("mo",null,".")])],-1))]),e[185]||(e[185]=t("p",null,"Otherwise, it is given by",-1)),t("mjx-container",E1,[(o(),n("svg",M1,e[182]||(e[182]=[a(' ',1)]))),e[183]||(e[183]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msub",null,[t("mi",null,"k"),t("mi",null,"I")]),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"4")]),t("munder",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mi",null,"α")]),t("mo",{stretchy:"false"},"("),t("mo",{stretchy:"false"},"("),t("msubsup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"I"),t("mo",null,"+"),t("msub",null,[t("mi",null,"h"),t("mi",null,"α")])]),t("mi",null,"α")]),t("msup",null,[t("mo",{stretchy:"false"},")"),t("mn",null,"2")]),t("mo",null,"+"),t("mo",{stretchy:"false"},"("),t("msubsup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"I"),t("mo",null,"−"),t("msub",null,[t("mi",null,"h"),t("mi",null,"α")])]),t("mi",null,"α")]),t("msup",null,[t("mo",{stretchy:"false"},")"),t("mn",null,"2")]),t("mo",{stretchy:"false"},")"),t("mo",null,",")])],-1))]),e[186]||(e[186]=t("p",null,[s("as in ["),t("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Sanderse2023"},"8"),s("].")],-1)),e[187]||(e[187]=t("p",null,"Differentiable version.",-1)),e[188]||(e[188]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1491",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",A1,[t("summary",null,[e[189]||(e[189]=t("a",{id:"IncompressibleNavierStokes.laplacian!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.laplacian!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.laplacian!")],-1)),e[190]||(e[190]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[191]||(e[191]=a('julia laplacian! (L, p, setup) -> Any
Compute Laplacian of pressure field (in-place version).
source
',3))]),t("details",C1,[t("summary",null,[e[192]||(e[192]=t("a",{id:"IncompressibleNavierStokes.laplacian-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.laplacian-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.laplacian")],-1)),e[193]||(e[193]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[194]||(e[194]=a('julia laplacian (p, setup) -> Any
Compute Laplacian of pressure field (differentiable version).
source
',3))]),t("details",V1,[t("summary",null,[e[195]||(e[195]=t("a",{id:"IncompressibleNavierStokes.momentum!-NTuple{5, Any}",href:"#IncompressibleNavierStokes.momentum!-NTuple{5, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.momentum!")],-1)),e[196]||(e[196]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[197]||(e[197]=a('julia momentum! (F, u, temp, t, setup) -> Any
Right hand side of momentum equations, excluding pressure gradient (in-place version).
source
',3))]),t("details",Z1,[t("summary",null,[e[198]||(e[198]=t("a",{id:"IncompressibleNavierStokes.momentum-NTuple{4, Any}",href:"#IncompressibleNavierStokes.momentum-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.momentum")],-1)),e[199]||(e[199]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[200]||(e[200]=a('julia momentum (u, temp, t, setup) -> Any
Right hand side of momentum equations, excluding pressure gradient (differentiable version).
source
',3))]),t("details",S1,[t("summary",null,[e[201]||(e[201]=t("a",{id:"IncompressibleNavierStokes.pressuregradient!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.pressuregradient!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.pressuregradient!")],-1)),e[202]||(e[202]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[203]||(e[203]=a('julia pressuregradient! (G, p, setup) -> Any
Compute pressure gradient (in-place version).
source
',3))]),t("details",N1,[t("summary",null,[e[204]||(e[204]=t("a",{id:"IncompressibleNavierStokes.pressuregradient-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.pressuregradient-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.pressuregradient")],-1)),e[205]||(e[205]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[206]||(e[206]=a('julia pressuregradient (p, setup) -> Any
Compute pressure gradient (differentiable version).
source
',3))]),t("details",I1,[t("summary",null,[e[207]||(e[207]=t("a",{id:"IncompressibleNavierStokes.scalewithvolume!-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.scalewithvolume!-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.scalewithvolume!")],-1)),e[208]||(e[208]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[209]||(e[209]=a('julia scalewithvolume! (p, setup) -> Any
Scale scalar field with volume sizes (in-place version).
source
',3))]),t("details",D1,[t("summary",null,[e[210]||(e[210]=t("a",{id:"IncompressibleNavierStokes.scalewithvolume-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.scalewithvolume-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.scalewithvolume")],-1)),e[211]||(e[211]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[212]||(e[212]=a('julia scalewithvolume (p, setup) -> Any
Scale scalar field p
with volume sizes (differentiable version).
source
',3))]),t("details",F1,[t("summary",null,[e[213]||(e[213]=t("a",{id:"IncompressibleNavierStokes.smagorinsky_closure-Tuple{Any}",href:"#IncompressibleNavierStokes.smagorinsky_closure-Tuple{Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.smagorinsky_closure")],-1)),e[214]||(e[214]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[215]||(e[215]=a(`julia smagorinsky_closure (
+ setup
+) -> IncompressibleNavierStokes . var"#closure#188"
Create Smagorinsky closure model m
. The model is called as m(u, θ)
, where the Smagorinsky constant θ
should be a scalar between 0
and 1
(for example θ = 0.1
).
source
`,3))]),t("details",O1,[t("summary",null,[e[216]||(e[216]=t("a",{id:"IncompressibleNavierStokes.smagtensor!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.smagtensor!-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.smagtensor!")],-1)),e[217]||(e[217]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[218]||(e[218]=a('julia smagtensor! (σ, u, θ, setup) -> Any
Compute Smagorinsky stress tensors σ[I]
(in-place version). The Smagorinsky constant θ
should be a scalar between 0
and 1
.
source
',3))]),t("details",B1,[t("summary",null,[e[219]||(e[219]=t("a",{id:"IncompressibleNavierStokes.total_kinetic_energy-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.total_kinetic_energy-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.total_kinetic_energy")],-1)),e[220]||(e[220]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[221]||(e[221]=a('julia total_kinetic_energy (u, setup; kwargs ... ) -> Any
Compute total kinetic energy. The velocity components are interpolated to the volume centers and squared.
source
',3))]),t("details",R1,[t("summary",null,[e[222]||(e[222]=t("a",{id:"IncompressibleNavierStokes.unit_cartesian_indices-Tuple{Any}",href:"#IncompressibleNavierStokes.unit_cartesian_indices-Tuple{Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.unit_cartesian_indices")],-1)),e[223]||(e[223]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[224]||(e[224]=a('julia unit_cartesian_indices (D) -> Any
Get tuple of all unit vectors as Cartesian indices.
source
',3))]),t("details",G1,[t("summary",null,[e[225]||(e[225]=t("a",{id:"IncompressibleNavierStokes.vorticity!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.vorticity!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.vorticity!")],-1)),e[226]||(e[226]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[227]||(e[227]=a('julia vorticity! (ω, u, setup) -> Any
Compute vorticity field (in-place version).
source
',3))]),t("details",J1,[t("summary",null,[e[228]||(e[228]=t("a",{id:"IncompressibleNavierStokes.vorticity-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.vorticity-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.vorticity")],-1)),e[229]||(e[229]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[230]||(e[230]=a('julia vorticity (u, setup) -> Any
Compute vorticity field (differentiable version).
source
',3))]),t("details",z1,[t("summary",null,[e[231]||(e[231]=t("a",{id:"IncompressibleNavierStokes.lastdimcontract-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.lastdimcontract-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.lastdimcontract")],-1)),e[232]||(e[232]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[233]||(e[233]=a('julia lastdimcontract (a, b, setup) -> Any
Compute c[I] = sum_i a[I, i] * b[I, i]
, where c[:, i]
and b[:, i]
are tensor fields (elements are SMatrix
es), a[:, i]
is a scalar field, and the i
dimension is contracted (multiple channels).
source
',3))]),t("details",P1,[t("summary",null,[e[234]||(e[234]=t("a",{id:"IncompressibleNavierStokes.tensorbasis!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.tensorbasis!-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.tensorbasis!")],-1)),e[235]||(e[235]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[257]||(e[257]=a('julia tensorbasis! (B, V, u, setup) -> Tuple{Any, Any}
',1)),t("p",null,[e[240]||(e[240]=s("Compute symmetry tensor basis ")),e[241]||(e[241]=t("code",null,"B[1]",-1)),e[242]||(e[242]=s("-")),e[243]||(e[243]=t("code",null,"B[11]",-1)),e[244]||(e[244]=s(" and invariants ")),e[245]||(e[245]=t("code",null,"V[1]",-1)),e[246]||(e[246]=s("-")),e[247]||(e[247]=t("code",null,"V[5]",-1)),e[248]||(e[248]=s(", as specified in [")),e[249]||(e[249]=t("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Silvis2017"},"9",-1)),e[250]||(e[250]=s("] in equations (9) and (11). Note that ")),e[251]||(e[251]=t("code",null,"B[1]",-1)),e[252]||(e[252]=s(" corresponds to ")),t("mjx-container",X1,[(o(),n("svg",q1,e[236]||(e[236]=[a(' ',1)]))),e[237]||(e[237]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"T"),t("mn",null,"0")])])],-1))]),e[253]||(e[253]=s(" in the paper, and ")),e[254]||(e[254]=t("code",null,"V",-1)),e[255]||(e[255]=s(" to ")),t("mjx-container",K1,[(o(),n("svg",U1,e[238]||(e[238]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D43C",d:"M43 1Q26 1 26 10Q26 12 29 24Q34 43 39 45Q42 46 54 46H60Q120 46 136 53Q137 53 138 54Q143 56 149 77T198 273Q210 318 216 344Q286 624 286 626Q284 630 284 631Q274 637 213 637H193Q184 643 189 662Q193 677 195 680T209 683H213Q285 681 359 681Q481 681 487 683H497Q504 676 504 672T501 655T494 639Q491 637 471 637Q440 637 407 634Q393 631 388 623Q381 609 337 432Q326 385 315 341Q245 65 245 59Q245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2Q143 2 113 2T65 2T43 1Z",style:{"stroke-width":"3"}})])])],-1)]))),e[239]||(e[239]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"I")])],-1))]),e[256]||(e[256]=s("."))]),e[258]||(e[258]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/tensorbasis.jl#L16",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",$1,[t("summary",null,[e[259]||(e[259]=t("a",{id:"IncompressibleNavierStokes.tensorbasis-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.tensorbasis-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.tensorbasis")],-1)),e[260]||(e[260]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[261]||(e[261]=a('julia tensorbasis (u, setup) -> Tuple{Any, Any}
Compute symmetry tensor basis (differentiable version).
source
',3))])])}const i2=Q(T,[["render",W1]]);export{l2 as __pageData,i2 as default};
diff --git a/previews/PR126/assets/manual_operators.md.CrXXLMhT.lean.js b/previews/PR126/assets/manual_operators.md.CrXXLMhT.lean.js
new file mode 100644
index 00000000..9fb21ca5
--- /dev/null
+++ b/previews/PR126/assets/manual_operators.md.CrXXLMhT.lean.js
@@ -0,0 +1,6 @@
+import{_ as Q,c as n,a5 as a,j as t,a as s,G as i,B as r,o}from"./chunks/framework.BSoZtefh.js";const l2=JSON.parse('{"title":"Operators","description":"","frontmatter":{},"headers":[],"relativePath":"manual/operators.md","filePath":"manual/operators.md","lastUpdated":null}'),T={name:"manual/operators.md"},d={class:"jldocstring custom-block",open:""},p={class:"jldocstring custom-block",open:""},m={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.873ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 828 683","aria-hidden":"true"},g={class:"jldocstring custom-block",open:""},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.873ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 828 683","aria-hidden":"true"},c={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.068ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.927ex",height:"5.369ex",role:"img",focusable:"false",viewBox:"0 -1459 5271.6 2372.9","aria-hidden":"true"},y={class:"jldocstring custom-block",open:""},f={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},v={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.79ex",height:"2.032ex",role:"img",focusable:"false",viewBox:"0 -704 791 898","aria-hidden":"true"},x={class:"jldocstring custom-block",open:""},w={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.79ex",height:"2.032ex",role:"img",focusable:"false",viewBox:"0 -704 791 898","aria-hidden":"true"},H={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},L={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.06ex"},xmlns:"http://www.w3.org/2000/svg",width:"22.907ex",height:"6.539ex",role:"img",focusable:"false",viewBox:"0 -1537.5 10125 2890.2","aria-hidden":"true"},E={class:"jldocstring custom-block",open:""},M={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},V={class:"jldocstring custom-block",open:""},Z={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""},N={class:"jldocstring custom-block",open:""},I={class:"jldocstring custom-block",open:""},D={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},O={class:"jldocstring custom-block",open:""},B={class:"jldocstring custom-block",open:""},R={class:"jldocstring custom-block",open:""},G={class:"jldocstring custom-block",open:""},J={class:"jldocstring custom-block",open:""},z={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},P={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.666ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.662ex",height:"2.363ex",role:"img",focusable:"false",viewBox:"0 -750 4270.6 1044.2","aria-hidden":"true"},X={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},K={class:"jldocstring custom-block",open:""},U={class:"jldocstring custom-block",open:""},$={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.034ex",height:"2.072ex",role:"img",focusable:"false",viewBox:"0 -833.9 3551.2 915.9","aria-hidden":"true"},Y={class:"jldocstring custom-block",open:""},_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},t1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.034ex",height:"2.072ex",role:"img",focusable:"false",viewBox:"0 -833.9 3551.2 915.9","aria-hidden":"true"},e1={class:"jldocstring custom-block",open:""},s1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},a1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.669ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.359ex",height:"2.69ex",role:"img",focusable:"false",viewBox:"0 -893.3 6788.6 1189","aria-hidden":"true"},l1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},i1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.666ex"},xmlns:"http://www.w3.org/2000/svg",width:"13.598ex",height:"2.363ex",role:"img",focusable:"false",viewBox:"0 -750 6010.1 1044.2","aria-hidden":"true"},n1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.114ex",height:"3.023ex",role:"img",focusable:"false",viewBox:"0 -983.2 4912.3 1336","aria-hidden":"true"},Q1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.253ex",height:"2.819ex",role:"img",focusable:"false",viewBox:"0 -893.3 6742 1246.1","aria-hidden":"true"},T1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.334ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.614ex",height:"3.686ex",role:"img",focusable:"false",viewBox:"0 -1039.8 5133.2 1629.3","aria-hidden":"true"},p1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.482ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.29ex",height:"3.851ex",role:"img",focusable:"false",viewBox:"0 -1047.1 8968.4 1702.1","aria-hidden":"true"},h1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.254ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.959ex",height:"3.238ex",role:"img",focusable:"false",viewBox:"0 -877 3517.7 1431","aria-hidden":"true"},u1={class:"jldocstring custom-block",open:""},k1={class:"jldocstring custom-block",open:""},c1={class:"jldocstring custom-block",open:""},b1={class:"jldocstring custom-block",open:""},y1={class:"jldocstring custom-block",open:""},f1={class:"jldocstring custom-block",open:""},v1={class:"jldocstring custom-block",open:""},x1={class:"jldocstring custom-block",open:""},w1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},H1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},L1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.619ex"},xmlns:"http://www.w3.org/2000/svg",width:"27.725ex",height:"5.656ex",role:"img",focusable:"false",viewBox:"0 -1342 12254.6 2499.8","aria-hidden":"true"},E1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},M1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.619ex"},xmlns:"http://www.w3.org/2000/svg",width:"32.233ex",height:"5.656ex",role:"img",focusable:"false",viewBox:"0 -1342 14247.1 2499.8","aria-hidden":"true"},A1={class:"jldocstring custom-block",open:""},C1={class:"jldocstring custom-block",open:""},V1={class:"jldocstring custom-block",open:""},Z1={class:"jldocstring custom-block",open:""},S1={class:"jldocstring custom-block",open:""},N1={class:"jldocstring custom-block",open:""},I1={class:"jldocstring custom-block",open:""},D1={class:"jldocstring custom-block",open:""},F1={class:"jldocstring custom-block",open:""},O1={class:"jldocstring custom-block",open:""},B1={class:"jldocstring custom-block",open:""},R1={class:"jldocstring custom-block",open:""},G1={class:"jldocstring custom-block",open:""},J1={class:"jldocstring custom-block",open:""},z1={class:"jldocstring custom-block",open:""},P1={class:"jldocstring custom-block",open:""},X1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.309ex",height:"1.906ex",role:"img",focusable:"false",viewBox:"0 -677 1020.6 842.6","aria-hidden":"true"},K1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.14ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 504 683","aria-hidden":"true"},$1={class:"jldocstring custom-block",open:""};function W1(Y1,e,_1,t2,e2,s2){const l=r("Badge");return o(),n("div",null,[e[262]||(e[262]=a('Operators All discrete operators are built using KernelAbstractions.jl and Cartesian indices, similar to WaterLily.jl . This allows for dimension- and backend-agnostic code. See this blog post for how to write kernels. IncompressibleNavierStokes previously relied on assembling sparse operators to perform the same operations. While being very efficient and also compatible with CUDA (CUSPARSE), storing these matrices in memory is expensive for large 3D problems.
',2)),t("details",d,[t("summary",null,[e[0]||(e[0]=t("a",{id:"IncompressibleNavierStokes.Offset",href:"#IncompressibleNavierStokes.Offset"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.Offset")],-1)),e[1]||(e[1]=s()),i(l,{type:"info",class:"jlObjectType jlType",text:"Type"})]),e[2]||(e[2]=a('Cartesian index unit vector in D = 2
or D = 3
dimensions. Calling Offset(D)(α)
returns a Cartesian index with 1
in the dimension α
and zeros elsewhere.
See https://b-fg.github.io/2023/05/07/waterlily-on-gpu.html for writing kernel loops using Cartesian indices.
Fields
source
',5))]),t("details",p,[t("summary",null,[e[3]||(e[3]=t("a",{id:"IncompressibleNavierStokes.Dfield!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.Dfield!-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.Dfield!")],-1)),e[4]||(e[4]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[9]||(e[9]=a('julia Dfield! (d, G, p, setup; ϵ) -> Any
',1)),t("p",null,[e[7]||(e[7]=s("Compute the ")),t("mjx-container",m,[(o(),n("svg",h,e[5]||(e[5]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D437",d:"M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z",style:{"stroke-width":"3"}})])])],-1)]))),e[6]||(e[6]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"D")])],-1))]),e[8]||(e[8]=s("-field (in-place version)."))]),e[10]||(e[10]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1389",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",g,[t("summary",null,[e[11]||(e[11]=t("a",{id:"IncompressibleNavierStokes.Dfield-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.Dfield-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.Dfield")],-1)),e[12]||(e[12]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[21]||(e[21]=a('julia Dfield (p, setup; kwargs ... ) -> Any
',1)),t("p",null,[e[15]||(e[15]=s("Compute the ")),t("mjx-container",u,[(o(),n("svg",k,e[13]||(e[13]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D437",d:"M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z",style:{"stroke-width":"3"}})])])],-1)]))),e[14]||(e[14]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"D")])],-1))]),e[16]||(e[16]=s("-field [")),e[17]||(e[17]=t("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#LiJiajia2019"},"5",-1)),e[18]||(e[18]=s("] given by"))]),t("mjx-container",c,[(o(),n("svg",b,e[19]||(e[19]=[a(' ',1)]))),e[20]||(e[20]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"D"),t("mo",null,"="),t("mfrac",null,[t("mrow",null,[t("mn",null,"2"),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),t("mi",{mathvariant:"normal"},"∇"),t("mi",null,"p"),t("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")]),t("mrow",null,[t("msup",null,[t("mi",{mathvariant:"normal"},"∇"),t("mn",null,"2")]),t("mi",null,"p")])]),t("mo",null,".")])],-1))]),e[22]||(e[22]=t("p",null,"Differentiable version.",-1)),e[23]||(e[23]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1374",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",y,[t("summary",null,[e[24]||(e[24]=t("a",{id:"IncompressibleNavierStokes.Qfield!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.Qfield!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.Qfield!")],-1)),e[25]||(e[25]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[30]||(e[30]=a('julia Qfield! (Q, u, setup) -> Any
',1)),t("p",null,[e[28]||(e[28]=s("Compute the ")),t("mjx-container",f,[(o(),n("svg",v,e[26]||(e[26]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D444",d:"M399 -80Q399 -47 400 -30T402 -11V-7L387 -11Q341 -22 303 -22Q208 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435Q740 255 592 107Q529 47 461 16L444 8V3Q444 2 449 -24T470 -66T516 -82Q551 -82 583 -60T625 -3Q631 11 638 11Q647 11 649 2Q649 -6 639 -34T611 -100T557 -165T481 -194Q399 -194 399 -87V-80ZM636 468Q636 523 621 564T580 625T530 655T477 665Q429 665 379 640Q277 591 215 464T153 216Q153 110 207 59Q231 38 236 38V46Q236 86 269 120T347 155Q372 155 390 144T417 114T429 82T435 55L448 64Q512 108 557 185T619 334T636 468ZM314 18Q362 18 404 39L403 49Q399 104 366 115Q354 117 347 117Q344 117 341 117T337 118Q317 118 296 98T274 52Q274 18 314 18Z",style:{"stroke-width":"3"}})])])],-1)]))),e[27]||(e[27]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"Q")])],-1))]),e[29]||(e[29]=s("-field (in-place version)."))]),e[31]||(e[31]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1440",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",x,[t("summary",null,[e[32]||(e[32]=t("a",{id:"IncompressibleNavierStokes.Qfield-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.Qfield-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.Qfield")],-1)),e[33]||(e[33]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[42]||(e[42]=a('julia Qfield (u, setup) -> Any
',1)),t("p",null,[e[36]||(e[36]=s("Compute ")),t("mjx-container",w,[(o(),n("svg",j,e[34]||(e[34]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D444",d:"M399 -80Q399 -47 400 -30T402 -11V-7L387 -11Q341 -22 303 -22Q208 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435Q740 255 592 107Q529 47 461 16L444 8V3Q444 2 449 -24T470 -66T516 -82Q551 -82 583 -60T625 -3Q631 11 638 11Q647 11 649 2Q649 -6 639 -34T611 -100T557 -165T481 -194Q399 -194 399 -87V-80ZM636 468Q636 523 621 564T580 625T530 655T477 665Q429 665 379 640Q277 591 215 464T153 216Q153 110 207 59Q231 38 236 38V46Q236 86 269 120T347 155Q372 155 390 144T417 114T429 82T435 55L448 64Q512 108 557 185T619 334T636 468ZM314 18Q362 18 404 39L403 49Q399 104 366 115Q354 117 347 117Q344 117 341 117T337 118Q317 118 296 98T274 52Q274 18 314 18Z",style:{"stroke-width":"3"}})])])],-1)]))),e[35]||(e[35]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"Q")])],-1))]),e[37]||(e[37]=s("-field [")),e[38]||(e[38]=t("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Jeong1995"},"6",-1)),e[39]||(e[39]=s("] given by"))]),t("mjx-container",H,[(o(),n("svg",L,e[40]||(e[40]=[a(' ',1)]))),e[41]||(e[41]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"Q"),t("mo",null,"="),t("mo",null,"−"),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")]),t("munder",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"α"),t("mo",null,","),t("mi",null,"β")])]),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mi",null,"α")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"β")])])]),t("mfrac",null,[t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"u"),t("mi",null,"β")])]),t("mrow",null,[t("mi",null,"∂"),t("msup",null,[t("mi",null,"x"),t("mi",null,"α")])])]),t("mo",null,".")])],-1))]),e[43]||(e[43]=t("p",null,"Differentiable version.",-1)),e[44]||(e[44]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1425",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",E,[t("summary",null,[e[45]||(e[45]=t("a",{id:"IncompressibleNavierStokes.applybodyforce!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.applybodyforce!-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.applybodyforce!")],-1)),e[46]||(e[46]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[47]||(e[47]=a('julia applybodyforce! (F, u, t, setup) -> Any
Compute body force (in-place version). Add the result to F
.
source
',3))]),t("details",M,[t("summary",null,[e[48]||(e[48]=t("a",{id:"IncompressibleNavierStokes.applybodyforce-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.applybodyforce-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.applybodyforce")],-1)),e[49]||(e[49]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[50]||(e[50]=a('julia applybodyforce (u, t, setup) -> Any
Compute body force (differentiable version).
source
',3))]),t("details",A,[t("summary",null,[e[51]||(e[51]=t("a",{id:"IncompressibleNavierStokes.applypressure!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.applypressure!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.applypressure!")],-1)),e[52]||(e[52]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[53]||(e[53]=a('julia applypressure! (u, p, setup) -> Any
Subtract pressure gradient (in-place version).
source
',3))]),t("details",C,[t("summary",null,[e[54]||(e[54]=t("a",{id:"IncompressibleNavierStokes.applypressure-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.applypressure-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.applypressure")],-1)),e[55]||(e[55]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[56]||(e[56]=a('julia applypressure (u, p, setup) -> Any
Subtract pressure gradient (differentiable version).
source
',3))]),t("details",V,[t("summary",null,[e[57]||(e[57]=t("a",{id:"IncompressibleNavierStokes.avg-NTuple{4, Any}",href:"#IncompressibleNavierStokes.avg-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.avg")],-1)),e[58]||(e[58]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[59]||(e[59]=a('julia avg (ϕ, Δ, I, α) -> Any
Average scalar field ϕ
in the α
-direction.
source
',3))]),t("details",Z,[t("summary",null,[e[60]||(e[60]=t("a",{id:"IncompressibleNavierStokes.convection!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.convection!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.convection!")],-1)),e[61]||(e[61]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[62]||(e[62]=a('julia convection! (F, u, setup) -> Any
Compute convective term (in-place version). Add the result to F
.
source
',3))]),t("details",S,[t("summary",null,[e[63]||(e[63]=t("a",{id:"IncompressibleNavierStokes.convection-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.convection-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.convection")],-1)),e[64]||(e[64]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[65]||(e[65]=a('julia convection (u, setup) -> Any
Compute convective term (differentiable version).
source
',3))]),t("details",N,[t("summary",null,[e[66]||(e[66]=t("a",{id:"IncompressibleNavierStokes.convection_diffusion_temp!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.convection_diffusion_temp!-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.convection_diffusion_temp!")],-1)),e[67]||(e[67]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[68]||(e[68]=a('julia convection_diffusion_temp! (c, u, temp, setup) -> Any
Compute convection-diffusion term for the temperature equation. (in-place version). Add result to c
.
source
',3))]),t("details",I,[t("summary",null,[e[69]||(e[69]=t("a",{id:"IncompressibleNavierStokes.convection_diffusion_temp-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.convection_diffusion_temp-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.convection_diffusion_temp")],-1)),e[70]||(e[70]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[71]||(e[71]=a('julia convection_diffusion_temp (u, temp, setup) -> Any
Compute convection-diffusion term for the temperature equation. (differentiable version).
source
',3))]),t("details",D,[t("summary",null,[e[72]||(e[72]=t("a",{id:"IncompressibleNavierStokes.convectiondiffusion!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.convectiondiffusion!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.convectiondiffusion!")],-1)),e[73]||(e[73]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[74]||(e[74]=a('julia convectiondiffusion! (F, u, setup) -> Any
Compute convective and diffusive terms (in-place version). Add the result to F
.
source
',3))]),t("details",F,[t("summary",null,[e[75]||(e[75]=t("a",{id:"IncompressibleNavierStokes.diffusion!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.diffusion!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.diffusion!")],-1)),e[76]||(e[76]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[77]||(e[77]=a('julia diffusion! (F, u, setup; use_viscosity) -> Any
Compute diffusive term (in-place version). Add the result to F
.
Keyword arguments:
with_viscosity = true
: Include viscosity in the operator.source
',5))]),t("details",O,[t("summary",null,[e[78]||(e[78]=t("a",{id:"IncompressibleNavierStokes.diffusion-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.diffusion-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.diffusion")],-1)),e[79]||(e[79]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[80]||(e[80]=a('julia diffusion (u, setup; kwargs ... ) -> Any
Compute diffusive term (differentiable version).
source
',3))]),t("details",B,[t("summary",null,[e[81]||(e[81]=t("a",{id:"IncompressibleNavierStokes.dissipation!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.dissipation!-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.dissipation!")],-1)),e[82]||(e[82]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[83]||(e[83]=a('julia dissipation! (diss, diff, u, setup) -> Any
Compute dissipation term for the temperature equation (in-place version). Add result to diss
.
source
',3))]),t("details",R,[t("summary",null,[e[84]||(e[84]=t("a",{id:"IncompressibleNavierStokes.dissipation-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.dissipation-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.dissipation")],-1)),e[85]||(e[85]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[86]||(e[86]=a('julia dissipation (u, setup) -> Any
Compute dissipation term for the temperature equation (differentiable version).
source
',3))]),t("details",G,[t("summary",null,[e[87]||(e[87]=t("a",{id:"IncompressibleNavierStokes.dissipation_from_strain!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.dissipation_from_strain!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.dissipation_from_strain!")],-1)),e[88]||(e[88]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[89]||(e[89]=a('julia dissipation_from_strain! (ϵ, u, setup) -> Any
Compute dissipation term from strain-rate tensor (in-place version).
source
',3))]),t("details",J,[t("summary",null,[e[90]||(e[90]=t("a",{id:"IncompressibleNavierStokes.dissipation_from_strain-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.dissipation_from_strain-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.dissipation_from_strain")],-1)),e[91]||(e[91]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[96]||(e[96]=a('julia dissipation_from_strain (u, setup) -> Any
',1)),t("p",null,[e[94]||(e[94]=s("Compute dissipation term ")),t("mjx-container",z,[(o(),n("svg",P,e[92]||(e[92]=[a(' ',1)]))),e[93]||(e[93]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mn",null,"2"),t("mi",null,"ν"),t("mo",{fence:"false",stretchy:"false"},"⟨"),t("msub",null,[t("mi",null,"S"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("msub",null,[t("mi",null,"S"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("mo",{fence:"false",stretchy:"false"},"⟩")])],-1))]),e[95]||(e[95]=s(" from strain-rate tensor (differentiable version)."))]),e[97]||(e[97]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L810",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",X,[t("summary",null,[e[98]||(e[98]=t("a",{id:"IncompressibleNavierStokes.divergence!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.divergence!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.divergence!")],-1)),e[99]||(e[99]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[100]||(e[100]=a('julia divergence! (div, u, setup) -> Any
Compute divergence of velocity field (in-place version).
source
',3))]),t("details",q,[t("summary",null,[e[101]||(e[101]=t("a",{id:"IncompressibleNavierStokes.divergence-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.divergence-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.divergence")],-1)),e[102]||(e[102]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[103]||(e[103]=a('julia divergence (u, setup) -> Any
Compute divergence of velocity field (differentiable version).
source
',3))]),t("details",K,[t("summary",null,[e[104]||(e[104]=t("a",{id:"IncompressibleNavierStokes.divoftensor!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.divoftensor!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.divoftensor!")],-1)),e[105]||(e[105]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[106]||(e[106]=a('julia divoftensor! (s, σ, setup) -> Any
Compute divergence of a tensor with all components in the pressure points (in-place version). The stress tensors should be precomputed and stored in σ
.
source
',3))]),t("details",U,[t("summary",null,[e[107]||(e[107]=t("a",{id:"IncompressibleNavierStokes.eig2field!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.eig2field!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.eig2field!")],-1)),e[108]||(e[108]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[113]||(e[113]=a('julia eig2field! (λ, u, setup) -> Any
',1)),t("p",null,[e[111]||(e[111]=s("Compute the second eigenvalue of ")),t("mjx-container",$,[(o(),n("svg",W,e[109]||(e[109]=[a(' ',1)]))),e[110]||(e[110]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"S"),t("mn",null,"2")]),t("mo",null,"+"),t("msup",null,[t("mi",null,"R"),t("mn",null,"2")])])],-1))]),e[112]||(e[112]=s(" (in-place version)."))]),e[114]||(e[114]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1470",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",Y,[t("summary",null,[e[115]||(e[115]=t("a",{id:"IncompressibleNavierStokes.eig2field-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.eig2field-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.eig2field")],-1)),e[116]||(e[116]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[123]||(e[123]=a('julia eig2field (u, setup) -> Any
',1)),t("p",null,[e[119]||(e[119]=s("Compute the second eigenvalue of ")),t("mjx-container",_,[(o(),n("svg",t1,e[117]||(e[117]=[a(' ',1)]))),e[118]||(e[118]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"S"),t("mn",null,"2")]),t("mo",null,"+"),t("msup",null,[t("mi",null,"R"),t("mn",null,"2")])])],-1))]),e[120]||(e[120]=s(", as proposed by Jeong and Hussain [")),e[121]||(e[121]=t("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Jeong1995"},"6",-1)),e[122]||(e[122]=s("]."))]),e[124]||(e[124]=t("p",null,"Differentiable version.",-1)),e[125]||(e[125]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1462",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",e1,[t("summary",null,[e[126]||(e[126]=t("a",{id:"IncompressibleNavierStokes.get_scale_numbers-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.get_scale_numbers-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.get_scale_numbers")],-1)),e[127]||(e[127]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[149]||(e[149]=a(`julia get_scale_numbers (
+ u,
+ setup
+) -> NamedTuple{( :uavg , :ϵ , :η , :λ , :Reλ , :L , :τ ), <: Tuple{Any, Any, Any, Any, Any, Nothing, Nothing} }
Get the following dimensional scale numbers [7 ]:
`,2)),t("ul",null,[t("li",null,[t("p",null,[e[130]||(e[130]=s("Velocity ")),t("mjx-container",s1,[(o(),n("svg",a1,e[128]||(e[128]=[a(' ',1)]))),e[129]||(e[129]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mtext",null,"avg")]),t("mo",null,"="),t("mo",{fence:"false",stretchy:"false"},"⟨"),t("msub",null,[t("mi",null,"u"),t("mi",null,"i")]),t("msub",null,[t("mi",null,"u"),t("mi",null,"i")]),t("msup",null,[t("mo",{fence:"false",stretchy:"false"},"⟩"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mn",null,"1"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"/")]),t("mn",null,"2")])])])],-1))])])]),t("li",null,[t("p",null,[e[133]||(e[133]=s("Dissipation rate ")),t("mjx-container",l1,[(o(),n("svg",i1,e[131]||(e[131]=[a(' ',1)]))),e[132]||(e[132]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"ϵ"),t("mo",null,"="),t("mn",null,"2"),t("mi",null,"ν"),t("mo",{fence:"false",stretchy:"false"},"⟨"),t("msub",null,[t("mi",null,"S"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("msub",null,[t("mi",null,"S"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("mo",{fence:"false",stretchy:"false"},"⟩")])],-1))])])]),t("li",null,[t("p",null,[e[136]||(e[136]=s("Kolmolgorov length scale ")),t("mjx-container",n1,[(o(),n("svg",o1,e[134]||(e[134]=[a(' ',1)]))),e[135]||(e[135]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"η"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("mfrac",null,[t("msup",null,[t("mi",null,"ν"),t("mn",null,"3")]),t("mi",null,"ϵ")]),t("msup",null,[t("mo",{stretchy:"false"},")"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mn",null,"1"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"/")]),t("mn",null,"4")])])])],-1))])])]),t("li",null,[t("p",null,[e[139]||(e[139]=s("Taylor length scale ")),t("mjx-container",Q1,[(o(),n("svg",r1,e[137]||(e[137]=[a(' ',1)]))),e[138]||(e[138]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"λ"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("mfrac",null,[t("mrow",null,[t("mn",null,"5"),t("mi",null,"ν")]),t("mi",null,"ϵ")]),t("msup",null,[t("mo",{stretchy:"false"},")"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mn",null,"1"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"/")]),t("mn",null,"2")])]),t("msub",null,[t("mi",null,"u"),t("mtext",null,"avg")])])],-1))])])]),t("li",null,[t("p",null,[e[142]||(e[142]=s("Taylor-scale Reynolds number ")),t("mjx-container",T1,[(o(),n("svg",d1,e[140]||(e[140]=[a(' ',1)]))),e[141]||(e[141]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"R"),t("msub",null,[t("mi",null,"e"),t("mi",null,"λ")]),t("mo",null,"="),t("mfrac",null,[t("mrow",null,[t("mi",null,"λ"),t("msub",null,[t("mi",null,"u"),t("mtext",null,"avg")])]),t("mrow",null,[t("msqrt",null,[t("mn",null,"3")]),t("mi",null,"ν")])])])],-1))])])]),t("li",null,[t("p",null,[e[145]||(e[145]=s("Integral length scale ")),t("mjx-container",p1,[(o(),n("svg",m1,e[143]||(e[143]=[a(' ',1)]))),e[144]||(e[144]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"L"),t("mo",null,"="),t("mfrac",null,[t("mrow",null,[t("mn",null,"3"),t("mi",null,"π")]),t("mrow",null,[t("mn",null,"2"),t("msubsup",null,[t("mi",null,"u"),t("mtext",null,"avg"),t("mn",null,"2")])])]),t("msubsup",null,[t("mo",{"data-mjx-texclass":"OP"},"∫"),t("mn",null,"0"),t("mi",{mathvariant:"normal"},"∞")]),t("mfrac",null,[t("mrow",null,[t("mi",null,"E"),t("mo",{stretchy:"false"},"("),t("mi",null,"k"),t("mo",{stretchy:"false"},")")]),t("mi",null,"k")]),t("mstyle",{scriptlevel:"0"},[t("mspace",{width:"0.167em"})]),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"k")])],-1))])])]),t("li",null,[t("p",null,[e[148]||(e[148]=s("Large-eddy turnover time ")),t("mjx-container",h1,[(o(),n("svg",g1,e[146]||(e[146]=[a(' ',1)]))),e[147]||(e[147]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"τ"),t("mo",null,"="),t("mfrac",null,[t("mi",null,"L"),t("msub",null,[t("mi",null,"u"),t("mtext",null,"avg")])])])],-1))])])])]),e[150]||(e[150]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1558",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",u1,[t("summary",null,[e[151]||(e[151]=t("a",{id:"IncompressibleNavierStokes.gravity!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.gravity!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.gravity!")],-1)),e[152]||(e[152]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[153]||(e[153]=a('julia gravity! (F, temp, setup) -> Any
Compute gravity term (in-place version). add the result to F
.
source
',3))]),t("details",k1,[t("summary",null,[e[154]||(e[154]=t("a",{id:"IncompressibleNavierStokes.gravity-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.gravity-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.gravity")],-1)),e[155]||(e[155]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[156]||(e[156]=a('julia gravity (temp, setup) -> Any
Compute gravity term (differentiable version).
source
',3))]),t("details",c1,[t("summary",null,[e[157]||(e[157]=t("a",{id:"IncompressibleNavierStokes.interpolate_u_p!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.interpolate_u_p!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.interpolate_u_p!")],-1)),e[158]||(e[158]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[159]||(e[159]=a('julia interpolate_u_p! (up, u, setup) -> Any
Interpolate velocity to pressure points (in-place version).
source
',3))]),t("details",b1,[t("summary",null,[e[160]||(e[160]=t("a",{id:"IncompressibleNavierStokes.interpolate_u_p-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.interpolate_u_p-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.interpolate_u_p")],-1)),e[161]||(e[161]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[162]||(e[162]=a('julia interpolate_u_p (u, setup) -> Any
Interpolate velocity to pressure points (differentiable version).
source
',3))]),t("details",y1,[t("summary",null,[e[163]||(e[163]=t("a",{id:"IncompressibleNavierStokes.interpolate_ω_p!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.interpolate_ω_p!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.interpolate_ω_p!")],-1)),e[164]||(e[164]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[165]||(e[165]=a('julia interpolate_ω_p! (ωp, ω, setup) -> Any
Interpolate vorticity to pressure points (in-place version).
source
',3))]),t("details",f1,[t("summary",null,[e[166]||(e[166]=t("a",{id:"IncompressibleNavierStokes.interpolate_ω_p-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.interpolate_ω_p-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.interpolate_ω_p")],-1)),e[167]||(e[167]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[168]||(e[168]=a('julia interpolate_ω_p (ω, setup) -> Any
Interpolate vorticity to pressure points (differentiable version).
source
',3))]),t("details",v1,[t("summary",null,[e[169]||(e[169]=t("a",{id:"IncompressibleNavierStokes.kinetic_energy!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.kinetic_energy!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.kinetic_energy!")],-1)),e[170]||(e[170]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[171]||(e[171]=a('julia kinetic_energy! (ke, u, setup; interpolate_first) -> Any
Compute kinetic energy field (in-place version).
source
',3))]),t("details",x1,[t("summary",null,[e[172]||(e[172]=t("a",{id:"IncompressibleNavierStokes.kinetic_energy-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.kinetic_energy-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.kinetic_energy")],-1)),e[173]||(e[173]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[184]||(e[184]=a('julia kinetic_energy (u, setup; kwargs ... ) -> Any
',1)),t("p",null,[e[176]||(e[176]=s("Compute kinetic energy field ")),t("mjx-container",w1,[(o(),n("svg",j1,e[174]||(e[174]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1)]))),e[175]||(e[175]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"k")])],-1))]),e[177]||(e[177]=s(" (in-place version). If ")),e[178]||(e[178]=t("code",null,"interpolate_first",-1)),e[179]||(e[179]=s(" is true, it is given by"))]),t("mjx-container",H1,[(o(),n("svg",L1,e[180]||(e[180]=[a(' ',1)]))),e[181]||(e[181]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msub",null,[t("mi",null,"k"),t("mi",null,"I")]),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"8")]),t("munder",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mi",null,"α")]),t("mo",{stretchy:"false"},"("),t("msubsup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"I"),t("mo",null,"+"),t("msub",null,[t("mi",null,"h"),t("mi",null,"α")])]),t("mi",null,"α")]),t("mo",null,"+"),t("msubsup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"I"),t("mo",null,"−"),t("msub",null,[t("mi",null,"h"),t("mi",null,"α")])]),t("mi",null,"α")]),t("msup",null,[t("mo",{stretchy:"false"},")"),t("mn",null,"2")]),t("mo",null,".")])],-1))]),e[185]||(e[185]=t("p",null,"Otherwise, it is given by",-1)),t("mjx-container",E1,[(o(),n("svg",M1,e[182]||(e[182]=[a(' ',1)]))),e[183]||(e[183]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("msub",null,[t("mi",null,"k"),t("mi",null,"I")]),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"4")]),t("munder",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mi",null,"α")]),t("mo",{stretchy:"false"},"("),t("mo",{stretchy:"false"},"("),t("msubsup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"I"),t("mo",null,"+"),t("msub",null,[t("mi",null,"h"),t("mi",null,"α")])]),t("mi",null,"α")]),t("msup",null,[t("mo",{stretchy:"false"},")"),t("mn",null,"2")]),t("mo",null,"+"),t("mo",{stretchy:"false"},"("),t("msubsup",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"I"),t("mo",null,"−"),t("msub",null,[t("mi",null,"h"),t("mi",null,"α")])]),t("mi",null,"α")]),t("msup",null,[t("mo",{stretchy:"false"},")"),t("mn",null,"2")]),t("mo",{stretchy:"false"},")"),t("mo",null,",")])],-1))]),e[186]||(e[186]=t("p",null,[s("as in ["),t("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Sanderse2023"},"8"),s("].")],-1)),e[187]||(e[187]=t("p",null,"Differentiable version.",-1)),e[188]||(e[188]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/operators.jl#L1491",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",A1,[t("summary",null,[e[189]||(e[189]=t("a",{id:"IncompressibleNavierStokes.laplacian!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.laplacian!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.laplacian!")],-1)),e[190]||(e[190]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[191]||(e[191]=a('julia laplacian! (L, p, setup) -> Any
Compute Laplacian of pressure field (in-place version).
source
',3))]),t("details",C1,[t("summary",null,[e[192]||(e[192]=t("a",{id:"IncompressibleNavierStokes.laplacian-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.laplacian-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.laplacian")],-1)),e[193]||(e[193]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[194]||(e[194]=a('julia laplacian (p, setup) -> Any
Compute Laplacian of pressure field (differentiable version).
source
',3))]),t("details",V1,[t("summary",null,[e[195]||(e[195]=t("a",{id:"IncompressibleNavierStokes.momentum!-NTuple{5, Any}",href:"#IncompressibleNavierStokes.momentum!-NTuple{5, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.momentum!")],-1)),e[196]||(e[196]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[197]||(e[197]=a('julia momentum! (F, u, temp, t, setup) -> Any
Right hand side of momentum equations, excluding pressure gradient (in-place version).
source
',3))]),t("details",Z1,[t("summary",null,[e[198]||(e[198]=t("a",{id:"IncompressibleNavierStokes.momentum-NTuple{4, Any}",href:"#IncompressibleNavierStokes.momentum-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.momentum")],-1)),e[199]||(e[199]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[200]||(e[200]=a('julia momentum (u, temp, t, setup) -> Any
Right hand side of momentum equations, excluding pressure gradient (differentiable version).
source
',3))]),t("details",S1,[t("summary",null,[e[201]||(e[201]=t("a",{id:"IncompressibleNavierStokes.pressuregradient!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.pressuregradient!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.pressuregradient!")],-1)),e[202]||(e[202]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[203]||(e[203]=a('julia pressuregradient! (G, p, setup) -> Any
Compute pressure gradient (in-place version).
source
',3))]),t("details",N1,[t("summary",null,[e[204]||(e[204]=t("a",{id:"IncompressibleNavierStokes.pressuregradient-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.pressuregradient-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.pressuregradient")],-1)),e[205]||(e[205]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[206]||(e[206]=a('julia pressuregradient (p, setup) -> Any
Compute pressure gradient (differentiable version).
source
',3))]),t("details",I1,[t("summary",null,[e[207]||(e[207]=t("a",{id:"IncompressibleNavierStokes.scalewithvolume!-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.scalewithvolume!-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.scalewithvolume!")],-1)),e[208]||(e[208]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[209]||(e[209]=a('julia scalewithvolume! (p, setup) -> Any
Scale scalar field with volume sizes (in-place version).
source
',3))]),t("details",D1,[t("summary",null,[e[210]||(e[210]=t("a",{id:"IncompressibleNavierStokes.scalewithvolume-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.scalewithvolume-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.scalewithvolume")],-1)),e[211]||(e[211]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[212]||(e[212]=a('julia scalewithvolume (p, setup) -> Any
Scale scalar field p
with volume sizes (differentiable version).
source
',3))]),t("details",F1,[t("summary",null,[e[213]||(e[213]=t("a",{id:"IncompressibleNavierStokes.smagorinsky_closure-Tuple{Any}",href:"#IncompressibleNavierStokes.smagorinsky_closure-Tuple{Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.smagorinsky_closure")],-1)),e[214]||(e[214]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[215]||(e[215]=a(`julia smagorinsky_closure (
+ setup
+) -> IncompressibleNavierStokes . var"#closure#188"
Create Smagorinsky closure model m
. The model is called as m(u, θ)
, where the Smagorinsky constant θ
should be a scalar between 0
and 1
(for example θ = 0.1
).
source
`,3))]),t("details",O1,[t("summary",null,[e[216]||(e[216]=t("a",{id:"IncompressibleNavierStokes.smagtensor!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.smagtensor!-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.smagtensor!")],-1)),e[217]||(e[217]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[218]||(e[218]=a('julia smagtensor! (σ, u, θ, setup) -> Any
Compute Smagorinsky stress tensors σ[I]
(in-place version). The Smagorinsky constant θ
should be a scalar between 0
and 1
.
source
',3))]),t("details",B1,[t("summary",null,[e[219]||(e[219]=t("a",{id:"IncompressibleNavierStokes.total_kinetic_energy-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.total_kinetic_energy-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.total_kinetic_energy")],-1)),e[220]||(e[220]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[221]||(e[221]=a('julia total_kinetic_energy (u, setup; kwargs ... ) -> Any
Compute total kinetic energy. The velocity components are interpolated to the volume centers and squared.
source
',3))]),t("details",R1,[t("summary",null,[e[222]||(e[222]=t("a",{id:"IncompressibleNavierStokes.unit_cartesian_indices-Tuple{Any}",href:"#IncompressibleNavierStokes.unit_cartesian_indices-Tuple{Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.unit_cartesian_indices")],-1)),e[223]||(e[223]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[224]||(e[224]=a('julia unit_cartesian_indices (D) -> Any
Get tuple of all unit vectors as Cartesian indices.
source
',3))]),t("details",G1,[t("summary",null,[e[225]||(e[225]=t("a",{id:"IncompressibleNavierStokes.vorticity!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.vorticity!-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.vorticity!")],-1)),e[226]||(e[226]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[227]||(e[227]=a('julia vorticity! (ω, u, setup) -> Any
Compute vorticity field (in-place version).
source
',3))]),t("details",J1,[t("summary",null,[e[228]||(e[228]=t("a",{id:"IncompressibleNavierStokes.vorticity-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.vorticity-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.vorticity")],-1)),e[229]||(e[229]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[230]||(e[230]=a('julia vorticity (u, setup) -> Any
Compute vorticity field (differentiable version).
source
',3))]),t("details",z1,[t("summary",null,[e[231]||(e[231]=t("a",{id:"IncompressibleNavierStokes.lastdimcontract-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.lastdimcontract-Tuple{Any, Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.lastdimcontract")],-1)),e[232]||(e[232]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[233]||(e[233]=a('julia lastdimcontract (a, b, setup) -> Any
Compute c[I] = sum_i a[I, i] * b[I, i]
, where c[:, i]
and b[:, i]
are tensor fields (elements are SMatrix
es), a[:, i]
is a scalar field, and the i
dimension is contracted (multiple channels).
source
',3))]),t("details",P1,[t("summary",null,[e[234]||(e[234]=t("a",{id:"IncompressibleNavierStokes.tensorbasis!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.tensorbasis!-NTuple{4, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.tensorbasis!")],-1)),e[235]||(e[235]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[257]||(e[257]=a('julia tensorbasis! (B, V, u, setup) -> Tuple{Any, Any}
',1)),t("p",null,[e[240]||(e[240]=s("Compute symmetry tensor basis ")),e[241]||(e[241]=t("code",null,"B[1]",-1)),e[242]||(e[242]=s("-")),e[243]||(e[243]=t("code",null,"B[11]",-1)),e[244]||(e[244]=s(" and invariants ")),e[245]||(e[245]=t("code",null,"V[1]",-1)),e[246]||(e[246]=s("-")),e[247]||(e[247]=t("code",null,"V[5]",-1)),e[248]||(e[248]=s(", as specified in [")),e[249]||(e[249]=t("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Silvis2017"},"9",-1)),e[250]||(e[250]=s("] in equations (9) and (11). Note that ")),e[251]||(e[251]=t("code",null,"B[1]",-1)),e[252]||(e[252]=s(" corresponds to ")),t("mjx-container",X1,[(o(),n("svg",q1,e[236]||(e[236]=[a(' ',1)]))),e[237]||(e[237]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"T"),t("mn",null,"0")])])],-1))]),e[253]||(e[253]=s(" in the paper, and ")),e[254]||(e[254]=t("code",null,"V",-1)),e[255]||(e[255]=s(" to ")),t("mjx-container",K1,[(o(),n("svg",U1,e[238]||(e[238]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D43C",d:"M43 1Q26 1 26 10Q26 12 29 24Q34 43 39 45Q42 46 54 46H60Q120 46 136 53Q137 53 138 54Q143 56 149 77T198 273Q210 318 216 344Q286 624 286 626Q284 630 284 631Q274 637 213 637H193Q184 643 189 662Q193 677 195 680T209 683H213Q285 681 359 681Q481 681 487 683H497Q504 676 504 672T501 655T494 639Q491 637 471 637Q440 637 407 634Q393 631 388 623Q381 609 337 432Q326 385 315 341Q245 65 245 59Q245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2Q143 2 113 2T65 2T43 1Z",style:{"stroke-width":"3"}})])])],-1)]))),e[239]||(e[239]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"I")])],-1))]),e[256]||(e[256]=s("."))]),e[258]||(e[258]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/tensorbasis.jl#L16",target:"_blank",rel:"noreferrer"},"source")],-1))]),t("details",$1,[t("summary",null,[e[259]||(e[259]=t("a",{id:"IncompressibleNavierStokes.tensorbasis-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.tensorbasis-Tuple{Any, Any}"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.tensorbasis")],-1)),e[260]||(e[260]=s()),i(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[261]||(e[261]=a('julia tensorbasis (u, setup) -> Tuple{Any, Any}
Compute symmetry tensor basis (differentiable version).
source
',3))])])}const i2=Q(T,[["render",W1]]);export{l2 as __pageData,i2 as default};
diff --git a/previews/PR126/assets/manual_precision.md.B1snHDv2.js b/previews/PR126/assets/manual_precision.md.B1snHDv2.js
new file mode 100644
index 00000000..f3f50be2
--- /dev/null
+++ b/previews/PR126/assets/manual_precision.md.B1snHDv2.js
@@ -0,0 +1 @@
+import{_ as o,c as i,a5 as s,o as r}from"./chunks/framework.BSoZtefh.js";const f=JSON.parse('{"title":"Floating point precision","description":"","frontmatter":{},"headers":[],"relativePath":"manual/precision.md","filePath":"manual/precision.md","lastUpdated":null}'),a={name:"manual/precision.md"};function n(t,e,c,l,p,d){return r(),i("div",null,e[0]||(e[0]=[s('Floating point precision IncompressibleNavierStokes generates efficient code for different floating point precisions, such as
To use single or half precision, all user input floats should be converted to the desired type. Mixing different precisions causes unnecessary conversions and may break the code.
GPU precision
For GPUs, single precision is preferred. CUDA.jl
s cu
converts to single precision.
Pressure solvers
SparseArrays.jl
s sparse matrix factorizations only support double precision. psolver_direct
only works for Float64
. Consider using an iterative solver such as psolver_cg
when using single or half precision.
',6)]))}const m=o(a,[["render",n]]);export{f as __pageData,m as default};
diff --git a/previews/PR126/assets/manual_precision.md.B1snHDv2.lean.js b/previews/PR126/assets/manual_precision.md.B1snHDv2.lean.js
new file mode 100644
index 00000000..f3f50be2
--- /dev/null
+++ b/previews/PR126/assets/manual_precision.md.B1snHDv2.lean.js
@@ -0,0 +1 @@
+import{_ as o,c as i,a5 as s,o as r}from"./chunks/framework.BSoZtefh.js";const f=JSON.parse('{"title":"Floating point precision","description":"","frontmatter":{},"headers":[],"relativePath":"manual/precision.md","filePath":"manual/precision.md","lastUpdated":null}'),a={name:"manual/precision.md"};function n(t,e,c,l,p,d){return r(),i("div",null,e[0]||(e[0]=[s('Floating point precision IncompressibleNavierStokes generates efficient code for different floating point precisions, such as
To use single or half precision, all user input floats should be converted to the desired type. Mixing different precisions causes unnecessary conversions and may break the code.
GPU precision
For GPUs, single precision is preferred. CUDA.jl
s cu
converts to single precision.
Pressure solvers
SparseArrays.jl
s sparse matrix factorizations only support double precision. psolver_direct
only works for Float64
. Consider using an iterative solver such as psolver_cg
when using single or half precision.
',6)]))}const m=o(a,[["render",n]]);export{f as __pageData,m as default};
diff --git a/previews/PR126/assets/manual_pressure.md.Bb8fJUK2.js b/previews/PR126/assets/manual_pressure.md.Bb8fJUK2.js
new file mode 100644
index 00000000..3060ea05
--- /dev/null
+++ b/previews/PR126/assets/manual_pressure.md.Bb8fJUK2.js
@@ -0,0 +1,16 @@
+import{_ as r,c as n,j as e,a as i,a5 as t,G as l,B as o,o as p}from"./chunks/framework.BSoZtefh.js";const I=JSON.parse('{"title":"Pressure solvers","description":"","frontmatter":{},"headers":[],"relativePath":"manual/pressure.md","filePath":"manual/pressure.md","lastUpdated":null}'),d={name:"manual/pressure.md"},h={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.194ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6715.6 1000","aria-hidden":"true"},c={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""};function f(C,s,N,F,S,x){const a=o("Badge");return p(),n("div",null,[s[35]||(s[35]=e("h1",{id:"Pressure-solvers",tabindex:"-1"},[i("Pressure solvers "),e("a",{class:"header-anchor",href:"#Pressure-solvers","aria-label":'Permalink to "Pressure solvers {#Pressure-solvers}"'},"")],-1)),s[36]||(s[36]=e("p",null,"The discrete pressure Poisson equation",-1)),e("mjx-container",h,[(p(),n("svg",k,s[0]||(s[0]=[t(' ',1)]))),s[1]||(s[1]=e("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[e("mi",null,"L"),e("mi",null,"p"),e("mo",null,"="),e("mi",null,"W"),e("mi",null,"M"),e("mi",null,"F"),e("mo",{stretchy:"false"},"("),e("mi",null,"u"),e("mo",{stretchy:"false"},")")])],-1))]),s[37]||(s[37]=e("p",null,"enforces divergence freeness. There are multiple options for solving this system.",-1)),e("details",c,[e("summary",null,[s[2]||(s[2]=e("a",{id:"IncompressibleNavierStokes.default_psolver-Tuple{Any}",href:"#IncompressibleNavierStokes.default_psolver-Tuple{Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.default_psolver")],-1)),s[3]||(s[3]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[4]||(s[4]=t(`julia default_psolver (
+ setup
+) -> Union{IncompressibleNavierStokes . var"#psolve!#101" {Bool}, IncompressibleNavierStokes . var"#psolve!#124" }
Get default Poisson solver from setup.
source
`,3))]),e("details",u,[e("summary",null,[s[5]||(s[5]=e("a",{id:"IncompressibleNavierStokes.poisson!-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.poisson!-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.poisson!")],-1)),s[6]||(s[6]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[7]||(s[7]=t('julia poisson! (psolver, f) -> Any
Solve the Poisson equation for the pressure (in-place version).
source
',3))]),e("details",g,[e("summary",null,[s[8]||(s[8]=e("a",{id:"IncompressibleNavierStokes.poisson-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.poisson-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.poisson")],-1)),s[9]||(s[9]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[10]||(s[10]=t('julia poisson (psolver, f) -> Any
Solve the Poisson equation for the pressure with right hand side f
at time t
. For periodic and no-slip BC, the sum of f
should be zero.
Differentiable version.
source
',4))]),e("details",b,[e("summary",null,[s[11]||(s[11]=e("a",{id:"IncompressibleNavierStokes.pressure!-NTuple{5, Any}",href:"#IncompressibleNavierStokes.pressure!-NTuple{5, Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.pressure!")],-1)),s[12]||(s[12]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[13]||(s[13]=t('julia pressure! (p, u, temp, t, setup; psolver, F)
Compute pressure from velocity field (in-place version).
source
',3))]),e("details",Q,[e("summary",null,[s[14]||(s[14]=e("a",{id:"IncompressibleNavierStokes.pressure-NTuple{4, Any}",href:"#IncompressibleNavierStokes.pressure-NTuple{4, Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.pressure")],-1)),s[15]||(s[15]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[16]||(s[16]=t('julia pressure (u, temp, t, setup; psolver)
Compute pressure from velocity field. This makes the pressure compatible with the velocity field, resulting in same order pressure as velocity.
Differentiable version.
source
',4))]),e("details",m,[e("summary",null,[s[17]||(s[17]=e("a",{id:"IncompressibleNavierStokes.project!-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.project!-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.project!")],-1)),s[18]||(s[18]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[19]||(s[19]=t('julia project! (u, setup; psolver, p)
Project velocity field onto divergence-free space (in-place version).
source
',3))]),e("details",T,[e("summary",null,[s[20]||(s[20]=e("a",{id:"IncompressibleNavierStokes.project-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.project-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.project")],-1)),s[21]||(s[21]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[22]||(s[22]=t('julia project (u, setup; psolver)
Project velocity field onto divergence-free space (differentiable version).
source
',3))]),e("details",y,[e("summary",null,[s[23]||(s[23]=e("a",{id:"IncompressibleNavierStokes.psolver_cg-Tuple{Any}",href:"#IncompressibleNavierStokes.psolver_cg-Tuple{Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.psolver_cg")],-1)),s[24]||(s[24]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[25]||(s[25]=t(`julia psolver_cg (
+ setup;
+ abstol,
+ reltol,
+ maxiter,
+ preconditioner
+) -> IncompressibleNavierStokes . var"#psolve!#111" {_A, _B, _C, IncompressibleNavierStokes . var"#laplace_diag#109" {ndrange, workgroupsize}} where {_A, _B, _C, ndrange, workgroupsize}
Conjugate gradients iterative Poisson solver.
source
`,3))]),e("details",v,[e("summary",null,[s[26]||(s[26]=e("a",{id:"IncompressibleNavierStokes.psolver_cg_matrix-Tuple{Any}",href:"#IncompressibleNavierStokes.psolver_cg_matrix-Tuple{Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.psolver_cg_matrix")],-1)),s[27]||(s[27]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[28]||(s[28]=t(`julia psolver_cg_matrix (
+ setup;
+ kwargs ...
+) -> IncompressibleNavierStokes . var"#psolve!#105" {Base . Pairs{Symbol, Union{}, Tuple{}, @NamedTuple {}}}
Conjugate gradients iterative Poisson solver. The kwargs
are passed to the cg!
function from IterativeSolvers.jl.
source
`,3))]),e("details",E,[e("summary",null,[s[29]||(s[29]=e("a",{id:"IncompressibleNavierStokes.psolver_direct-Tuple{Any}",href:"#IncompressibleNavierStokes.psolver_direct-Tuple{Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.psolver_direct")],-1)),s[30]||(s[30]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[31]||(s[31]=t(`julia psolver_direct (
+ setup
+) -> IncompressibleNavierStokes . var"#psolve!#101" {Bool}
Create direct Poisson solver using an appropriate matrix decomposition.
source
`,3))]),e("details",j,[e("summary",null,[s[32]||(s[32]=e("a",{id:"IncompressibleNavierStokes.psolver_spectral-Tuple{Any}",href:"#IncompressibleNavierStokes.psolver_spectral-Tuple{Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.psolver_spectral")],-1)),s[33]||(s[33]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[34]||(s[34]=t(`julia psolver_spectral (
+ setup
+) -> IncompressibleNavierStokes . var"#psolve!#124"
Create spectral Poisson solver from setup.
source
`,3))])])}const H=r(d,[["render",f]]);export{I as __pageData,H as default};
diff --git a/previews/PR126/assets/manual_pressure.md.Bb8fJUK2.lean.js b/previews/PR126/assets/manual_pressure.md.Bb8fJUK2.lean.js
new file mode 100644
index 00000000..3060ea05
--- /dev/null
+++ b/previews/PR126/assets/manual_pressure.md.Bb8fJUK2.lean.js
@@ -0,0 +1,16 @@
+import{_ as r,c as n,j as e,a as i,a5 as t,G as l,B as o,o as p}from"./chunks/framework.BSoZtefh.js";const I=JSON.parse('{"title":"Pressure solvers","description":"","frontmatter":{},"headers":[],"relativePath":"manual/pressure.md","filePath":"manual/pressure.md","lastUpdated":null}'),d={name:"manual/pressure.md"},h={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.194ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6715.6 1000","aria-hidden":"true"},c={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},Q={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""};function f(C,s,N,F,S,x){const a=o("Badge");return p(),n("div",null,[s[35]||(s[35]=e("h1",{id:"Pressure-solvers",tabindex:"-1"},[i("Pressure solvers "),e("a",{class:"header-anchor",href:"#Pressure-solvers","aria-label":'Permalink to "Pressure solvers {#Pressure-solvers}"'},"")],-1)),s[36]||(s[36]=e("p",null,"The discrete pressure Poisson equation",-1)),e("mjx-container",h,[(p(),n("svg",k,s[0]||(s[0]=[t(' ',1)]))),s[1]||(s[1]=e("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[e("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[e("mi",null,"L"),e("mi",null,"p"),e("mo",null,"="),e("mi",null,"W"),e("mi",null,"M"),e("mi",null,"F"),e("mo",{stretchy:"false"},"("),e("mi",null,"u"),e("mo",{stretchy:"false"},")")])],-1))]),s[37]||(s[37]=e("p",null,"enforces divergence freeness. There are multiple options for solving this system.",-1)),e("details",c,[e("summary",null,[s[2]||(s[2]=e("a",{id:"IncompressibleNavierStokes.default_psolver-Tuple{Any}",href:"#IncompressibleNavierStokes.default_psolver-Tuple{Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.default_psolver")],-1)),s[3]||(s[3]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[4]||(s[4]=t(`julia default_psolver (
+ setup
+) -> Union{IncompressibleNavierStokes . var"#psolve!#101" {Bool}, IncompressibleNavierStokes . var"#psolve!#124" }
Get default Poisson solver from setup.
source
`,3))]),e("details",u,[e("summary",null,[s[5]||(s[5]=e("a",{id:"IncompressibleNavierStokes.poisson!-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.poisson!-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.poisson!")],-1)),s[6]||(s[6]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[7]||(s[7]=t('julia poisson! (psolver, f) -> Any
Solve the Poisson equation for the pressure (in-place version).
source
',3))]),e("details",g,[e("summary",null,[s[8]||(s[8]=e("a",{id:"IncompressibleNavierStokes.poisson-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.poisson-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.poisson")],-1)),s[9]||(s[9]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[10]||(s[10]=t('julia poisson (psolver, f) -> Any
Solve the Poisson equation for the pressure with right hand side f
at time t
. For periodic and no-slip BC, the sum of f
should be zero.
Differentiable version.
source
',4))]),e("details",b,[e("summary",null,[s[11]||(s[11]=e("a",{id:"IncompressibleNavierStokes.pressure!-NTuple{5, Any}",href:"#IncompressibleNavierStokes.pressure!-NTuple{5, Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.pressure!")],-1)),s[12]||(s[12]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[13]||(s[13]=t('julia pressure! (p, u, temp, t, setup; psolver, F)
Compute pressure from velocity field (in-place version).
source
',3))]),e("details",Q,[e("summary",null,[s[14]||(s[14]=e("a",{id:"IncompressibleNavierStokes.pressure-NTuple{4, Any}",href:"#IncompressibleNavierStokes.pressure-NTuple{4, Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.pressure")],-1)),s[15]||(s[15]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[16]||(s[16]=t('julia pressure (u, temp, t, setup; psolver)
Compute pressure from velocity field. This makes the pressure compatible with the velocity field, resulting in same order pressure as velocity.
Differentiable version.
source
',4))]),e("details",m,[e("summary",null,[s[17]||(s[17]=e("a",{id:"IncompressibleNavierStokes.project!-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.project!-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.project!")],-1)),s[18]||(s[18]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[19]||(s[19]=t('julia project! (u, setup; psolver, p)
Project velocity field onto divergence-free space (in-place version).
source
',3))]),e("details",T,[e("summary",null,[s[20]||(s[20]=e("a",{id:"IncompressibleNavierStokes.project-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.project-Tuple{Any, Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.project")],-1)),s[21]||(s[21]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[22]||(s[22]=t('julia project (u, setup; psolver)
Project velocity field onto divergence-free space (differentiable version).
source
',3))]),e("details",y,[e("summary",null,[s[23]||(s[23]=e("a",{id:"IncompressibleNavierStokes.psolver_cg-Tuple{Any}",href:"#IncompressibleNavierStokes.psolver_cg-Tuple{Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.psolver_cg")],-1)),s[24]||(s[24]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[25]||(s[25]=t(`julia psolver_cg (
+ setup;
+ abstol,
+ reltol,
+ maxiter,
+ preconditioner
+) -> IncompressibleNavierStokes . var"#psolve!#111" {_A, _B, _C, IncompressibleNavierStokes . var"#laplace_diag#109" {ndrange, workgroupsize}} where {_A, _B, _C, ndrange, workgroupsize}
Conjugate gradients iterative Poisson solver.
source
`,3))]),e("details",v,[e("summary",null,[s[26]||(s[26]=e("a",{id:"IncompressibleNavierStokes.psolver_cg_matrix-Tuple{Any}",href:"#IncompressibleNavierStokes.psolver_cg_matrix-Tuple{Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.psolver_cg_matrix")],-1)),s[27]||(s[27]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[28]||(s[28]=t(`julia psolver_cg_matrix (
+ setup;
+ kwargs ...
+) -> IncompressibleNavierStokes . var"#psolve!#105" {Base . Pairs{Symbol, Union{}, Tuple{}, @NamedTuple {}}}
Conjugate gradients iterative Poisson solver. The kwargs
are passed to the cg!
function from IterativeSolvers.jl.
source
`,3))]),e("details",E,[e("summary",null,[s[29]||(s[29]=e("a",{id:"IncompressibleNavierStokes.psolver_direct-Tuple{Any}",href:"#IncompressibleNavierStokes.psolver_direct-Tuple{Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.psolver_direct")],-1)),s[30]||(s[30]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[31]||(s[31]=t(`julia psolver_direct (
+ setup
+) -> IncompressibleNavierStokes . var"#psolve!#101" {Bool}
Create direct Poisson solver using an appropriate matrix decomposition.
source
`,3))]),e("details",j,[e("summary",null,[s[32]||(s[32]=e("a",{id:"IncompressibleNavierStokes.psolver_spectral-Tuple{Any}",href:"#IncompressibleNavierStokes.psolver_spectral-Tuple{Any}"},[e("span",{class:"jlbinding"},"IncompressibleNavierStokes.psolver_spectral")],-1)),s[33]||(s[33]=i()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[34]||(s[34]=t(`julia psolver_spectral (
+ setup
+) -> IncompressibleNavierStokes . var"#psolve!#124"
Create spectral Poisson solver from setup.
source
`,3))])])}const H=r(d,[["render",f]]);export{I as __pageData,H as default};
diff --git a/previews/PR126/assets/manual_sciml.md.CogLuKgu.js b/previews/PR126/assets/manual_sciml.md.CogLuKgu.js
new file mode 100644
index 00000000..b8c2a8b0
--- /dev/null
+++ b/previews/PR126/assets/manual_sciml.md.CogLuKgu.js
@@ -0,0 +1,61 @@
+import{_ as T,c as i,j as s,a as t,a5 as n,G as Q,B as p,o as e}from"./chunks/framework.BSoZtefh.js";const L=JSON.parse('{"title":"Using IncompressibleNavierStokes in SciML","description":"","frontmatter":{},"headers":[],"relativePath":"manual/sciml.md","filePath":"manual/sciml.md","lastUpdated":null}'),r={name:"manual/sciml.md"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.605ex",height:"4.676ex",role:"img",focusable:"false",viewBox:"0 -1370 5571.2 2067","aria-hidden":"true"},h={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.243ex"},xmlns:"http://www.w3.org/2000/svg",width:"52.497ex",height:"7.618ex",role:"img",focusable:"false",viewBox:"0 -1933.5 23203.8 3367","aria-hidden":"true"},g={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""};function c(u,a,y,E,H,f){const l=p("Badge");return e(),i("div",null,[a[14]||(a[14]=s("h1",{id:"Using-IncompressibleNavierStokes-in-SciML",tabindex:"-1"},[t("Using IncompressibleNavierStokes in SciML "),s("a",{class:"header-anchor",href:"#Using-IncompressibleNavierStokes-in-SciML","aria-label":'Permalink to "Using IncompressibleNavierStokes in SciML {#Using-IncompressibleNavierStokes-in-SciML}"'},"")],-1)),a[15]||(a[15]=s("p",null,[t("The "),s("a",{href:"https://sciml.ai/",target:"_blank",rel:"noreferrer"},"SciML organization"),t(" is a collection of tools for solving equations and modeling systems. It has a coherent development principle, unified APIs over large collections of equation solvers, pervasive differentiability and sensitivity analysis, and features many of the highest performance and parallel implementations one can find.")],-1)),s("p",null,[a[2]||(a[2]=t("In particular, ")),a[3]||(a[3]=s("a",{href:"https://docs.sciml.ai/DiffEqDocs/stable/",target:"_blank",rel:"noreferrer"},"DifferentialEquations.jl",-1)),a[4]||(a[4]=t(" contains tools to solve differential equations defined as ")),s("mjx-container",d,[(e(),i("svg",o,a[0]||(a[0]=[n(' ',1)]))),a[1]||(a[1]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mstyle",{displaystyle:"true",scriptlevel:"0"},[s("mfrac",null,[s("mrow",null,[s("mi",null,"d"),s("mi",null,"u")]),s("mrow",null,[s("mi",null,"d"),s("mi",null,"t")])])]),s("mo",null,"="),s("mi",null,"f"),s("mo",{stretchy:"false"},"("),s("mi",null,"u"),s("mo",null,","),s("mi",null,"t"),s("mo",{stretchy:"false"},")")])],-1))]),a[5]||(a[5]=t(" that include a large collection of solvers, sensitivity analysis, and more."))]),a[16]||(a[16]=s("p",null,"Using IncompressibleNavierStokes it is possible to write the momentum equations without the pressure by explicitly solving the discrete Poisson equation and obtaining:",-1)),s("mjx-container",h,[(e(),i("svg",m,a[6]||(a[6]=[n(' ',1)]))),a[7]||(a[7]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[s("mtr",null,[s("mtd",null,[s("mfrac",null,[s("mrow",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"d")]),s("msub",null,[s("mi",null,"u"),s("mi",null,"h")])]),s("mrow",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"d")]),s("mi",null,"t")])])]),s("mtd",null,[s("mi"),s("mo",null,"="),s("mo",{stretchy:"false"},"("),s("mi",null,"I"),s("mo",null,"−"),s("mi",null,"G"),s("msup",null,[s("mi",null,"L"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",null,"−"),s("mn",null,"1")])]),s("mi",null,"W"),s("mi",null,"M"),s("mo",{stretchy:"false"},")"),s("mo",{stretchy:"false"},"("),s("mi",null,"F"),s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"u"),s("mi",null,"h")]),s("mo",{stretchy:"false"},")"),s("mo",null,"−"),s("msub",null,[s("mi",null,"y"),s("mi",null,"G")]),s("mo",{stretchy:"false"},")"),s("mo",null,"−"),s("mi",null,"G"),s("msup",null,[s("mi",null,"L"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",null,"−"),s("mn",null,"1")])]),s("mi",null,"W"),s("mfrac",null,[s("mrow",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"d")]),s("msub",null,[s("mi",null,"y"),s("mi",null,"M")])]),s("mrow",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"d")]),s("mi",null,"t")])])])]),s("mtr",null,[s("mtd"),s("mtd",null,[s("mi"),s("mo",null,"="),s("mi",null,"f"),s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"u"),s("mi",null,"h")]),s("mo",{stretchy:"false"},")"),s("mo",null,".")])])])])],-1))]),a[17]||(a[17]=n(`The derivation and the drawbacks of this approach are discussed in the documentation.
This projected right-hand side can be used in the SciML solvers to solve the Navier-Stokes equations. The following example shows how to use the SciML solvers to solve the ODEs obtained from the Navier-Stokes equations.
OrdinaryDiffEqTsit5
We here use the explicit solver Tsit5
from OrdinaryDiffEqTsit5 directly to skip loading all the toolchains for implicit solvers, which takes a while to install on GitHub.
julia using OrdinaryDiffEqTsit5
+using IncompressibleNavierStokes
+ax = range ( 0 , 1 , 101 )
+setup = Setup (; x = (ax, ax), Re = 500.0 )
+psolver = default_psolver (setup)
+f = create_right_hand_side (setup, psolver)
+u0 = random_field (setup)
+tspan = ( 0.0 , 1.0 ) # time span where to solve.
+problem = ODEProblem (f, u0, tspan) #SciMLBase.ODEProblem
+sol = solve (problem, Tsit5 (), reltol = 1e-8 , abstol = 1e-8 ) # sol: SciMLBase.ODESolution
retcode: Success
+Interpolation: specialized 4th order "free" interpolation
+t: 205-element Vector{Float64}:
+ 0.0
+ 0.0016532604327842326
+ 0.0024146677536511806
+ 0.00363820027112176
+ 0.0046728379665379825
+ 0.005865854727739244
+ 0.00703229270934183
+ 0.008261979706355872
+ 0.00950289172478397
+ 0.010776693536653715
+ ⋮
+ 0.8941795613844775
+ 0.9078054755801236
+ 0.9216552716704063
+ 0.9357343583321837
+ 0.9500492205436287
+ 0.9646067031383294
+ 0.9794153561555403
+ 0.9944855551823507
+ 1.0
+u: 205-element Vector{Array{Float64, 3}}:
+ [-1.1497959004240497 -1.103859466061489 … -1.1497959004240497 -1.103859466061489; -1.1115143411258799 -0.9429561713756396 … -1.1115143411258799 -0.9429561713756396; … ; -1.1497959004240497 -1.103859466061489 … -1.1497959004240497 -1.103859466061489; -1.1115143411258799 -0.9429561713756396 … -1.1115143411258799 -0.9429561713756396;;; 0.5780115453257968 0.5469734191664433 … 0.5780115453257968 0.5469734191664433; 0.38274219346754745 0.22183889878169927 … 0.38274219346754745 0.22183889878169927; … ; 0.5780115453257968 0.5469734191664433 … 0.5780115453257968 0.5469734191664433; 0.38274219346754745 0.22183889878169927 … 0.38274219346754745 0.22183889878169927]
+ [-1.1346613606845686 -1.0855072360047884 … -1.1346613606845686 -1.0855072360047884; -1.085037198186501 -0.9549916902794789 … -1.1141909765562603 -0.9096660650644737; … ; -1.1346613606845686 -1.1166526851389142 … -1.1526234274797011 -1.0855072360047884; -1.085037198186501 -0.9096660650644737 … -1.085037198186501 -0.9096660650644737;;; 0.5348228779300479 0.49420120289039515 … 0.5348228779300479 0.49420120289039515; 0.36016046276699126 0.22339559857696653 … 0.38505659343640064 0.18790302303797013; … ; 0.5348228779300479 0.5391582593084667 … 0.5729023909384506 0.49420120289039515; 0.36016046276699126 0.18790302303797013 … 0.36016046276699126 0.18790302303797013]
+ [-1.1275112161577667 -1.0766474494567906 … -1.1275112161577667 -1.0766474494567906; -1.0727913835432734 -0.9600781739950909 … -1.1150543083213575 -0.89417212831079; … ; -1.1275112161577667 -1.1220668609155946 … -1.1535842546753374 -1.0766474494567906; -1.0727913835432734 -0.89417212831079 … -1.0727913835432734 -0.89417212831079;;; 0.5153486288796626 0.47013625606217296 … 0.5153486288796626 0.47013625606217296; 0.35015697415699687 0.22415383919864973 … 0.3861425261191531 0.17253189812249553; … ; 0.5153486288796626 0.5356791510589715 … 0.5706805537830523 0.47013625606217296; 0.35015697415699687 0.17253189812249553 … 0.35015697415699687 0.17253189812249553]
+ [-1.115791210346112 -1.0618913129242453 … -1.115791210346112 -1.0618913129242453; -1.0530471523275629 -0.9676671701020543 … -1.1159698680800068 -0.8690782171432961; … ; -1.115791210346112 -1.1301641192252425 … -1.1547077134986383 -1.0618913129242453; -1.0530471523275629 -0.8690782171432961 … -1.0530471523275629 -0.8690782171432961;;; 0.48460061794136766 0.4318044995873348 … 0.48460061794136766 0.4318044995873348; 0.3346205322468639 0.22543475374003244 … 0.3879317028632203 0.14820437517173785; … ; 0.48460061794136766 0.5302324605858955 … 0.5672680917061951 0.4318044995873348; 0.3346205322468639 0.14820437517173785 … 0.3346205322468639 0.14820437517173785]
+ [-1.1056623764044726 -1.0489286853670308 … -1.1056623764044726 -1.0489286853670308; -1.0362876016533211 -0.973536845827031 … -1.116302725354632 -0.8476828485928333; … ; -1.1056623764044726 -1.13645399605545 … -1.15527603203835 -1.0489286853670308; -1.0362876016533211 -0.8476828485928333 … -1.0362876016533211 -0.8476828485928333;;; 0.45912379905057876 0.3997350530360164 … 0.45912379905057876 0.3997350530360164; 0.32201394196248373 0.22658484203123946 … 0.38950199225965854 0.1280170517465823; … ; 0.45912379905057876 0.5257537338406175 … 0.5645235044022956 0.3997350530360164; 0.32201394196248373 0.1280170517465823 … 0.32201394196248373 0.1280170517465823]
+ [-1.0937360551737667 -1.033448432276319 … -1.0937360551737667 -1.033448432276319; -1.016888150998382 -0.9797010100588621 … -1.1162000839959745 -0.8228280508550142; … ; -1.0937360551737667 -1.1431022705819454 … -1.155525040969178 -1.033448432276319; -1.016888150998382 -0.8228280508550142 … -1.016888150998382 -0.8228280508550142;;; 0.4303448034117328 0.3631723200120001 … 0.4303448034117328 0.3631723200120001; 0.30810063100471446 0.22799658044988205 … 0.3913978409729652 0.10521028774297245; … ; 0.4303448034117328 0.5207197729247011 … 0.5615068658901985 0.3631723200120001; 0.30810063100471446 0.10521028774297245 … 0.30810063100471446 0.10521028774297245]
+ [-1.0818179126332947 -1.017777477021206 … -1.0818179126332947 -1.017777477021206; -0.9978395965840717 -0.985121109614881 … -1.1156110131887644 -0.7983499821356742; … ; -1.0818179126332947 -1.1490058520154316 … -1.155373929433073 -1.017777477021206; -0.9978395965840717 -0.7983499821356742 … -0.9978395965840717 -0.7983499821356742;;; 0.4028305926913382 0.32787966255870815 … 0.4028305926913382 0.32787966255870815; 0.29516328161840344 0.22947578757224885 … 0.39336052997279874 0.08343345266475344; … ; 0.4028305926913382 0.5159196315853526 … 0.5587001992401808 0.32787966255870815; 0.29516328161840344 0.08343345266475344 … 0.29516328161840344 0.08343345266475344]
+ [-1.0689728566019476 -1.0007005310637664 … -1.0689728566019476 -1.0007005310637664; -0.9776642956614491 -0.9902057985315252 … -1.1144827384890157 -0.7723686929371345; … ; -1.0689728566019476 -1.1546228014296884 … -1.1548192169142335 -1.0007005310637664; -0.9776642956614491 -0.7723686929371345 … -0.9776642956614491 -0.7723686929371345;;; 0.37450087975122837 0.2911900290948907 … 0.37450087975122837 0.2911900290948907; 0.2822627011814225 0.2311534258019005 … 0.3955704287000623 0.06107350259837589; … ; 0.37450087975122837 0.5109760351214467 … 0.5558845173235043 0.2911900290948907; 0.2822627011814225 0.06107350259837589 … 0.2822627011814225 0.06107350259837589]
+ [-1.0557104502212835 -0.98290497413801 … -1.0557104502212835 -0.98290497413801; -0.9571981772852441 -0.9947020543270665 … -1.112831934231493 -0.7459792626280486; … ; -1.0557104502212835 -1.159691496764516 … -1.1538735439479935 -0.98290497413801; -0.9571981772852441 -0.7459792626280486 … -0.9571981772852441 -0.7459792626280486;;; 0.3466294362329091 0.25473497640670373 … 0.3466294362329091 0.25473497640670373; 0.2700409002155431 0.23298308009129398 … 0.39797252252874177 0.03917271924219536; … ; 0.3466294362329091 0.5060968589005629 … 0.5531844874459036 0.25473497640670373; 0.2700409002155431 0.03917271924219536 … 0.2700409002155431 0.03917271924219536]
+ [-1.0417716988708505 -0.9640648283520794 … -1.0417716988708505 -0.9640648283520794; -0.9360670368222949 -0.9986737540219488 … -1.1106175142395858 -0.7187223936406196; … ; -1.0417716988708505 -1.164299793748669 … -1.1525237629964271 -0.9640648283520794; -0.9360670368222949 -0.7187223936406196 … -0.9360670368222949 -0.7187223936406196;;; 0.31878633596239114 0.21794448332547656 … 0.31878633596239114 0.21794448332547656; 0.2583595321941497 0.23501950287987414 … 0.4006455426065916 0.01742911897904579; … ; 0.31878633596239114 0.5011925616695612 … 0.5505552476458456 0.21794448332547656; 0.2583595321941497 0.01742911897904579 … 0.2583595321941497 0.01742911897904579]
+ ⋮
+ [-0.3358150426428933 0.08514883033891986 … -0.3358150426428933 0.08514883033891986; -0.6822163312167452 -0.2538408443323854 … -0.23209785262194438 -0.14429868098101484; … ; -0.3358150426428933 -0.22512241076345169 … -0.20162486397754953 0.08514883033891986; -0.6822163312167452 -0.14429868098101484 … -0.6822163312167452 -0.14429868098101484;;; -2.413252043540796 -1.712717842276099 … -2.413252043540796 -1.712717842276099; -1.9714430928489248 -0.03294202753333163 … -0.06166046110225782 -1.3811337699727226; … ; -2.413252043540796 -0.028377068257785687 … -0.059007992026413034 -1.712717842276099; -1.9714430928489248 -1.3811337699727226 … -1.9714430928489248 -1.3811337699727226]
+ [-0.3443703509054663 0.07804405812322168 … -0.3443703509054663 0.07804405812322168; -0.6900799622769885 -0.253560889619927 … -0.2335135045673072 -0.15045383338219104; … ; -0.3443703509054663 -0.22697545368575067 … -0.2050262150692242 0.07804405812322168; -0.6900799622769885 -0.15045383338219104 … -0.6900799622769885 -0.15045383338219104;;; -2.4127188120242553 -1.714952104037445 … -2.4127188120242553 -1.714952104037445; -1.973869748314881 -0.029852159852162042 … -0.05643759578633058 -1.38694462894733; … ; -2.4127188120242553 -0.02189198831650714 … -0.05092301185049 -1.714952104037445; -1.973869748314881 -1.38694462894733 … -1.973869748314881 -1.38694462894733]
+ [-0.3521208550434111 0.07166696164953267 … -0.3521208550434111 0.07166696164953267; -0.6970256705507138 -0.2526021649984651 … -0.2341365128310068 -0.15581321954177493; … ; -0.3521208550434111 -0.22814552544624836 … -0.20770415442477874 0.07166696164953267; -0.6970256705507138 -0.15581321954177493 … -0.6970256705507138 -0.15581321954177493;;; -2.413653040525908 -1.7186928211396268 … -2.413653040525908 -1.7186928211396268; -1.9779073862294974 -0.028053785497743476 … -0.05251042504995188 -1.3942856234021603; … ; -2.413653040525908 -0.01669002567933338 … -0.044026891631948575 -1.7186928211396268; -1.9779073862294974 -1.3942856234021603 … -1.9779073862294974 -1.3942856234021603]
+ [-0.3590863750002272 0.06598805856519219 … -0.3590863750002272 0.06598805856519219; -0.7031107550673309 -0.2510409346609563 … -0.23402738021341402 -0.16043991156025073; … ; -0.3590863750002272 -0.22867111893081069 … -0.20967527421369125 0.06598805856519219; -0.7031107550673309 -0.16043991156025073 … -0.7031107550673309 -0.16043991156025073;;; -2.416024534868256 -1.723872489579331 … -2.416024534868256 -1.723872489579331; -1.9834413457601845 -0.027429681496909608 … -0.04979949722704688 -1.403004376360536; … ; -2.416024534868256 -0.012727978639355316 … -0.03831240805257915 -1.723872489579331; -1.9834413457601845 -1.403004376360536 … -1.9834413457601845 -1.403004376360536]
+ [-0.3652980205085376 0.06096950392486076 … -0.3652980205085376 0.06096950392486076; -0.7084032158463106 -0.24895698959505633 … -0.2332565481814833 -0.1644037721629653; … ; -0.3652980205085376 -0.22859911461839777 … -0.2109689121025174 0.06096950392486076; -0.7084032158463106 -0.1644037721629653 … -0.7084032158463106 -0.1644037721629653;;; -2.4197773569414047 -1.7304006749449456 … -2.4197773569414047 -1.7304006749449456; -1.9903347484325364 -0.02784369088700459 … -0.04820156586365496 -1.4129330066989474; … ; -2.4197773569414047 -0.009938183248749033 … -0.03374644742324412 -1.7304006749449456; -1.9903347484325364 -1.4129330066989474 … -1.9903347484325364 -1.4129330066989474]
+ [-0.37079634137002254 0.056566824007777634 … -0.37079634137002254 0.056566824007777634; -0.712978650101423 -0.24643040015093676 … -0.2319006320762357 -0.16777870978576348; … ; -0.37079634137002254 -0.22798219939833356 … -0.2116246634276885 0.056566824007777634; -0.712978650101423 -0.16777870978576348 … -0.712978650101423 -0.16777870978576348;;; -2.4248325802875517 -1.738167507524028 … -2.4248325802875517 -1.738167507524028; -1.9984340450617921 -0.029146265694757346 … -0.047594466447352254 -1.4238938738403897; … ; -2.4248325802875517 -0.0082317942377285 … -0.0302723003246664 -1.738167507524028; -1.9984340450617921 -1.4238938738403897 … -1.9984340450617921 -1.4238938738403897]
+ [-0.3756301420976148 0.05273005356731644 … -0.3756301420976148 0.05273005356731644; -0.7169178171593397 -0.24353842434524517 … -0.2300387249620156 -0.1706405509962637; … ; -0.3756301420976148 -0.22687634313714175 … -0.21168989553081277 0.05273005356731644; -0.7169178171593397 -0.1706405509962637 … -0.7169178171593397 -0.1706405509962637;;; -2.431092300940214 -1.7470485803590445 … -2.431092300940214 -1.7470485803590445; -2.0075756948585846 -0.03118012716031498 … -0.04784220836840984 -1.4357065008740522; … ; -2.431092300940214 -0.007502321042711482 … -0.02781217117877902 -1.7470485803590445; -2.0075756948585846 -1.4357065008740522 … -2.0075756948585846 -1.4357065008740522]
+ [-0.37985447595772653 0.04940548238785496 … -0.37985447595772653 0.04940548238785496; -0.7203036773419135 -0.24035309346769054 … -0.22774905685784178 -0.17306463080541906; … ; -0.37985447595772653 -0.22533838987028504 … -0.21121702489250443 0.04940548238785496; -0.7203036773419135 -0.17306463080541906 … -0.7203036773419135 -0.17306463080541906;;; -2.4384439931530535 -1.756909669413564 … -2.4384439931530535 -1.756909669413564; -2.0175922027968425 -0.03378575200165975 … -0.04880045559905625 -1.4481932237374657; … ; -2.4384439931530535 -0.007629985783351074 … -0.02627092263190513 -1.756909669413564; -2.0175922027968425 -1.4481932237374657 … -2.0175922027968425 -1.4481932237374657]
+ [-0.38124295443269 0.048318947816810065 … -0.38124295443269 0.048318947816810065; -0.7214075191431352 -0.23914227277597178 … -0.22683070520154086 -0.17384740055570305; … ; -0.38124295443269 -0.22468695331191318 … -0.210924277835274 0.048318947816810065; -0.7214075191431352 -0.17384740055570305 … -0.7214075191431352 -0.17384740055570305;;; -2.4413467449387483 -1.7606885966448282 … -2.4413467449387483 -1.7606885966448282; -2.0213960714842503 -0.034837801211528435 … -0.04929312067557789 -1.4528396960719592; … ; -2.4413467449387483 -0.007862325088914351 … -0.025919216403936674 -1.7606885966448282; -2.0213960714842503 -1.4528396960719592 … -2.0213960714842503 -1.4528396960719592]
Alternatively, it is also possible to use an in-place formulation
julia f! (du,u,p,t) = right_hand_side! (du, u, Ref ([setup, psolver]), t)
+u = similar (u0)
+du = similar (u0)
+p = nothing
+t = 0.0
+f! (du,u,p,t)
that is usually faster than the out-of-place formulation.
You can look here for more information on how to use the SciML solvers and all the options available.
API `,10)),s("details",g,[s("summary",null,[a[8]||(a[8]=s("a",{id:"IncompressibleNavierStokes.create_right_hand_side-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.create_right_hand_side-Tuple{Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.create_right_hand_side")],-1)),a[9]||(a[9]=t()),Q(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),a[10]||(a[10]=n(`julia create_right_hand_side (
+ setup,
+ psolver
+) -> IncompressibleNavierStokes . var"#right_hand_side#343"
create_right_hand_side(setup, psolver)
Creates a function that computes the right-hand side of the Navier-Stokes equations for a given setup and pressure solver.
Arguments
Returns
A function that computes the right-hand side of the Navier-Stokes equations.
source
`,8))]),s("details",k,[s("summary",null,[a[11]||(a[11]=s("a",{id:"IncompressibleNavierStokes.right_hand_side!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.right_hand_side!-NTuple{4, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.right_hand_side!")],-1)),a[12]||(a[12]=t()),Q(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),a[13]||(a[13]=n('julia right_hand_side! (dudt, u, params_ref, t)
right_hand_side!(dudt, u, params_ref, t)
Computes the right-hand side of the Navier-Stokes equations in-place.
Arguments
dudt
: The array to store the computed right-hand side.
u
: The current velocity field.
params_ref
: A reference to the parameters containing the setup and pressure solver.
t
: The current time.
Returns
Nothing. The result is stored in dudt
.
source
',8))])])}const v=T(r,[["render",c]]);export{L as __pageData,v as default};
diff --git a/previews/PR126/assets/manual_sciml.md.CogLuKgu.lean.js b/previews/PR126/assets/manual_sciml.md.CogLuKgu.lean.js
new file mode 100644
index 00000000..b8c2a8b0
--- /dev/null
+++ b/previews/PR126/assets/manual_sciml.md.CogLuKgu.lean.js
@@ -0,0 +1,61 @@
+import{_ as T,c as i,j as s,a as t,a5 as n,G as Q,B as p,o as e}from"./chunks/framework.BSoZtefh.js";const L=JSON.parse('{"title":"Using IncompressibleNavierStokes in SciML","description":"","frontmatter":{},"headers":[],"relativePath":"manual/sciml.md","filePath":"manual/sciml.md","lastUpdated":null}'),r={name:"manual/sciml.md"},d={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.605ex",height:"4.676ex",role:"img",focusable:"false",viewBox:"0 -1370 5571.2 2067","aria-hidden":"true"},h={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.243ex"},xmlns:"http://www.w3.org/2000/svg",width:"52.497ex",height:"7.618ex",role:"img",focusable:"false",viewBox:"0 -1933.5 23203.8 3367","aria-hidden":"true"},g={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""};function c(u,a,y,E,H,f){const l=p("Badge");return e(),i("div",null,[a[14]||(a[14]=s("h1",{id:"Using-IncompressibleNavierStokes-in-SciML",tabindex:"-1"},[t("Using IncompressibleNavierStokes in SciML "),s("a",{class:"header-anchor",href:"#Using-IncompressibleNavierStokes-in-SciML","aria-label":'Permalink to "Using IncompressibleNavierStokes in SciML {#Using-IncompressibleNavierStokes-in-SciML}"'},"")],-1)),a[15]||(a[15]=s("p",null,[t("The "),s("a",{href:"https://sciml.ai/",target:"_blank",rel:"noreferrer"},"SciML organization"),t(" is a collection of tools for solving equations and modeling systems. It has a coherent development principle, unified APIs over large collections of equation solvers, pervasive differentiability and sensitivity analysis, and features many of the highest performance and parallel implementations one can find.")],-1)),s("p",null,[a[2]||(a[2]=t("In particular, ")),a[3]||(a[3]=s("a",{href:"https://docs.sciml.ai/DiffEqDocs/stable/",target:"_blank",rel:"noreferrer"},"DifferentialEquations.jl",-1)),a[4]||(a[4]=t(" contains tools to solve differential equations defined as ")),s("mjx-container",d,[(e(),i("svg",o,a[0]||(a[0]=[n(' ',1)]))),a[1]||(a[1]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mstyle",{displaystyle:"true",scriptlevel:"0"},[s("mfrac",null,[s("mrow",null,[s("mi",null,"d"),s("mi",null,"u")]),s("mrow",null,[s("mi",null,"d"),s("mi",null,"t")])])]),s("mo",null,"="),s("mi",null,"f"),s("mo",{stretchy:"false"},"("),s("mi",null,"u"),s("mo",null,","),s("mi",null,"t"),s("mo",{stretchy:"false"},")")])],-1))]),a[5]||(a[5]=t(" that include a large collection of solvers, sensitivity analysis, and more."))]),a[16]||(a[16]=s("p",null,"Using IncompressibleNavierStokes it is possible to write the momentum equations without the pressure by explicitly solving the discrete Poisson equation and obtaining:",-1)),s("mjx-container",h,[(e(),i("svg",m,a[6]||(a[6]=[n(' ',1)]))),a[7]||(a[7]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[s("mtr",null,[s("mtd",null,[s("mfrac",null,[s("mrow",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"d")]),s("msub",null,[s("mi",null,"u"),s("mi",null,"h")])]),s("mrow",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"d")]),s("mi",null,"t")])])]),s("mtd",null,[s("mi"),s("mo",null,"="),s("mo",{stretchy:"false"},"("),s("mi",null,"I"),s("mo",null,"−"),s("mi",null,"G"),s("msup",null,[s("mi",null,"L"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",null,"−"),s("mn",null,"1")])]),s("mi",null,"W"),s("mi",null,"M"),s("mo",{stretchy:"false"},")"),s("mo",{stretchy:"false"},"("),s("mi",null,"F"),s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"u"),s("mi",null,"h")]),s("mo",{stretchy:"false"},")"),s("mo",null,"−"),s("msub",null,[s("mi",null,"y"),s("mi",null,"G")]),s("mo",{stretchy:"false"},")"),s("mo",null,"−"),s("mi",null,"G"),s("msup",null,[s("mi",null,"L"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mo",null,"−"),s("mn",null,"1")])]),s("mi",null,"W"),s("mfrac",null,[s("mrow",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"d")]),s("msub",null,[s("mi",null,"y"),s("mi",null,"M")])]),s("mrow",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"d")]),s("mi",null,"t")])])])]),s("mtr",null,[s("mtd"),s("mtd",null,[s("mi"),s("mo",null,"="),s("mi",null,"f"),s("mo",{stretchy:"false"},"("),s("msub",null,[s("mi",null,"u"),s("mi",null,"h")]),s("mo",{stretchy:"false"},")"),s("mo",null,".")])])])])],-1))]),a[17]||(a[17]=n(`The derivation and the drawbacks of this approach are discussed in the documentation.
This projected right-hand side can be used in the SciML solvers to solve the Navier-Stokes equations. The following example shows how to use the SciML solvers to solve the ODEs obtained from the Navier-Stokes equations.
OrdinaryDiffEqTsit5
We here use the explicit solver Tsit5
from OrdinaryDiffEqTsit5 directly to skip loading all the toolchains for implicit solvers, which takes a while to install on GitHub.
julia using OrdinaryDiffEqTsit5
+using IncompressibleNavierStokes
+ax = range ( 0 , 1 , 101 )
+setup = Setup (; x = (ax, ax), Re = 500.0 )
+psolver = default_psolver (setup)
+f = create_right_hand_side (setup, psolver)
+u0 = random_field (setup)
+tspan = ( 0.0 , 1.0 ) # time span where to solve.
+problem = ODEProblem (f, u0, tspan) #SciMLBase.ODEProblem
+sol = solve (problem, Tsit5 (), reltol = 1e-8 , abstol = 1e-8 ) # sol: SciMLBase.ODESolution
retcode: Success
+Interpolation: specialized 4th order "free" interpolation
+t: 205-element Vector{Float64}:
+ 0.0
+ 0.0016532604327842326
+ 0.0024146677536511806
+ 0.00363820027112176
+ 0.0046728379665379825
+ 0.005865854727739244
+ 0.00703229270934183
+ 0.008261979706355872
+ 0.00950289172478397
+ 0.010776693536653715
+ ⋮
+ 0.8941795613844775
+ 0.9078054755801236
+ 0.9216552716704063
+ 0.9357343583321837
+ 0.9500492205436287
+ 0.9646067031383294
+ 0.9794153561555403
+ 0.9944855551823507
+ 1.0
+u: 205-element Vector{Array{Float64, 3}}:
+ [-1.1497959004240497 -1.103859466061489 … -1.1497959004240497 -1.103859466061489; -1.1115143411258799 -0.9429561713756396 … -1.1115143411258799 -0.9429561713756396; … ; -1.1497959004240497 -1.103859466061489 … -1.1497959004240497 -1.103859466061489; -1.1115143411258799 -0.9429561713756396 … -1.1115143411258799 -0.9429561713756396;;; 0.5780115453257968 0.5469734191664433 … 0.5780115453257968 0.5469734191664433; 0.38274219346754745 0.22183889878169927 … 0.38274219346754745 0.22183889878169927; … ; 0.5780115453257968 0.5469734191664433 … 0.5780115453257968 0.5469734191664433; 0.38274219346754745 0.22183889878169927 … 0.38274219346754745 0.22183889878169927]
+ [-1.1346613606845686 -1.0855072360047884 … -1.1346613606845686 -1.0855072360047884; -1.085037198186501 -0.9549916902794789 … -1.1141909765562603 -0.9096660650644737; … ; -1.1346613606845686 -1.1166526851389142 … -1.1526234274797011 -1.0855072360047884; -1.085037198186501 -0.9096660650644737 … -1.085037198186501 -0.9096660650644737;;; 0.5348228779300479 0.49420120289039515 … 0.5348228779300479 0.49420120289039515; 0.36016046276699126 0.22339559857696653 … 0.38505659343640064 0.18790302303797013; … ; 0.5348228779300479 0.5391582593084667 … 0.5729023909384506 0.49420120289039515; 0.36016046276699126 0.18790302303797013 … 0.36016046276699126 0.18790302303797013]
+ [-1.1275112161577667 -1.0766474494567906 … -1.1275112161577667 -1.0766474494567906; -1.0727913835432734 -0.9600781739950909 … -1.1150543083213575 -0.89417212831079; … ; -1.1275112161577667 -1.1220668609155946 … -1.1535842546753374 -1.0766474494567906; -1.0727913835432734 -0.89417212831079 … -1.0727913835432734 -0.89417212831079;;; 0.5153486288796626 0.47013625606217296 … 0.5153486288796626 0.47013625606217296; 0.35015697415699687 0.22415383919864973 … 0.3861425261191531 0.17253189812249553; … ; 0.5153486288796626 0.5356791510589715 … 0.5706805537830523 0.47013625606217296; 0.35015697415699687 0.17253189812249553 … 0.35015697415699687 0.17253189812249553]
+ [-1.115791210346112 -1.0618913129242453 … -1.115791210346112 -1.0618913129242453; -1.0530471523275629 -0.9676671701020543 … -1.1159698680800068 -0.8690782171432961; … ; -1.115791210346112 -1.1301641192252425 … -1.1547077134986383 -1.0618913129242453; -1.0530471523275629 -0.8690782171432961 … -1.0530471523275629 -0.8690782171432961;;; 0.48460061794136766 0.4318044995873348 … 0.48460061794136766 0.4318044995873348; 0.3346205322468639 0.22543475374003244 … 0.3879317028632203 0.14820437517173785; … ; 0.48460061794136766 0.5302324605858955 … 0.5672680917061951 0.4318044995873348; 0.3346205322468639 0.14820437517173785 … 0.3346205322468639 0.14820437517173785]
+ [-1.1056623764044726 -1.0489286853670308 … -1.1056623764044726 -1.0489286853670308; -1.0362876016533211 -0.973536845827031 … -1.116302725354632 -0.8476828485928333; … ; -1.1056623764044726 -1.13645399605545 … -1.15527603203835 -1.0489286853670308; -1.0362876016533211 -0.8476828485928333 … -1.0362876016533211 -0.8476828485928333;;; 0.45912379905057876 0.3997350530360164 … 0.45912379905057876 0.3997350530360164; 0.32201394196248373 0.22658484203123946 … 0.38950199225965854 0.1280170517465823; … ; 0.45912379905057876 0.5257537338406175 … 0.5645235044022956 0.3997350530360164; 0.32201394196248373 0.1280170517465823 … 0.32201394196248373 0.1280170517465823]
+ [-1.0937360551737667 -1.033448432276319 … -1.0937360551737667 -1.033448432276319; -1.016888150998382 -0.9797010100588621 … -1.1162000839959745 -0.8228280508550142; … ; -1.0937360551737667 -1.1431022705819454 … -1.155525040969178 -1.033448432276319; -1.016888150998382 -0.8228280508550142 … -1.016888150998382 -0.8228280508550142;;; 0.4303448034117328 0.3631723200120001 … 0.4303448034117328 0.3631723200120001; 0.30810063100471446 0.22799658044988205 … 0.3913978409729652 0.10521028774297245; … ; 0.4303448034117328 0.5207197729247011 … 0.5615068658901985 0.3631723200120001; 0.30810063100471446 0.10521028774297245 … 0.30810063100471446 0.10521028774297245]
+ [-1.0818179126332947 -1.017777477021206 … -1.0818179126332947 -1.017777477021206; -0.9978395965840717 -0.985121109614881 … -1.1156110131887644 -0.7983499821356742; … ; -1.0818179126332947 -1.1490058520154316 … -1.155373929433073 -1.017777477021206; -0.9978395965840717 -0.7983499821356742 … -0.9978395965840717 -0.7983499821356742;;; 0.4028305926913382 0.32787966255870815 … 0.4028305926913382 0.32787966255870815; 0.29516328161840344 0.22947578757224885 … 0.39336052997279874 0.08343345266475344; … ; 0.4028305926913382 0.5159196315853526 … 0.5587001992401808 0.32787966255870815; 0.29516328161840344 0.08343345266475344 … 0.29516328161840344 0.08343345266475344]
+ [-1.0689728566019476 -1.0007005310637664 … -1.0689728566019476 -1.0007005310637664; -0.9776642956614491 -0.9902057985315252 … -1.1144827384890157 -0.7723686929371345; … ; -1.0689728566019476 -1.1546228014296884 … -1.1548192169142335 -1.0007005310637664; -0.9776642956614491 -0.7723686929371345 … -0.9776642956614491 -0.7723686929371345;;; 0.37450087975122837 0.2911900290948907 … 0.37450087975122837 0.2911900290948907; 0.2822627011814225 0.2311534258019005 … 0.3955704287000623 0.06107350259837589; … ; 0.37450087975122837 0.5109760351214467 … 0.5558845173235043 0.2911900290948907; 0.2822627011814225 0.06107350259837589 … 0.2822627011814225 0.06107350259837589]
+ [-1.0557104502212835 -0.98290497413801 … -1.0557104502212835 -0.98290497413801; -0.9571981772852441 -0.9947020543270665 … -1.112831934231493 -0.7459792626280486; … ; -1.0557104502212835 -1.159691496764516 … -1.1538735439479935 -0.98290497413801; -0.9571981772852441 -0.7459792626280486 … -0.9571981772852441 -0.7459792626280486;;; 0.3466294362329091 0.25473497640670373 … 0.3466294362329091 0.25473497640670373; 0.2700409002155431 0.23298308009129398 … 0.39797252252874177 0.03917271924219536; … ; 0.3466294362329091 0.5060968589005629 … 0.5531844874459036 0.25473497640670373; 0.2700409002155431 0.03917271924219536 … 0.2700409002155431 0.03917271924219536]
+ [-1.0417716988708505 -0.9640648283520794 … -1.0417716988708505 -0.9640648283520794; -0.9360670368222949 -0.9986737540219488 … -1.1106175142395858 -0.7187223936406196; … ; -1.0417716988708505 -1.164299793748669 … -1.1525237629964271 -0.9640648283520794; -0.9360670368222949 -0.7187223936406196 … -0.9360670368222949 -0.7187223936406196;;; 0.31878633596239114 0.21794448332547656 … 0.31878633596239114 0.21794448332547656; 0.2583595321941497 0.23501950287987414 … 0.4006455426065916 0.01742911897904579; … ; 0.31878633596239114 0.5011925616695612 … 0.5505552476458456 0.21794448332547656; 0.2583595321941497 0.01742911897904579 … 0.2583595321941497 0.01742911897904579]
+ ⋮
+ [-0.3358150426428933 0.08514883033891986 … -0.3358150426428933 0.08514883033891986; -0.6822163312167452 -0.2538408443323854 … -0.23209785262194438 -0.14429868098101484; … ; -0.3358150426428933 -0.22512241076345169 … -0.20162486397754953 0.08514883033891986; -0.6822163312167452 -0.14429868098101484 … -0.6822163312167452 -0.14429868098101484;;; -2.413252043540796 -1.712717842276099 … -2.413252043540796 -1.712717842276099; -1.9714430928489248 -0.03294202753333163 … -0.06166046110225782 -1.3811337699727226; … ; -2.413252043540796 -0.028377068257785687 … -0.059007992026413034 -1.712717842276099; -1.9714430928489248 -1.3811337699727226 … -1.9714430928489248 -1.3811337699727226]
+ [-0.3443703509054663 0.07804405812322168 … -0.3443703509054663 0.07804405812322168; -0.6900799622769885 -0.253560889619927 … -0.2335135045673072 -0.15045383338219104; … ; -0.3443703509054663 -0.22697545368575067 … -0.2050262150692242 0.07804405812322168; -0.6900799622769885 -0.15045383338219104 … -0.6900799622769885 -0.15045383338219104;;; -2.4127188120242553 -1.714952104037445 … -2.4127188120242553 -1.714952104037445; -1.973869748314881 -0.029852159852162042 … -0.05643759578633058 -1.38694462894733; … ; -2.4127188120242553 -0.02189198831650714 … -0.05092301185049 -1.714952104037445; -1.973869748314881 -1.38694462894733 … -1.973869748314881 -1.38694462894733]
+ [-0.3521208550434111 0.07166696164953267 … -0.3521208550434111 0.07166696164953267; -0.6970256705507138 -0.2526021649984651 … -0.2341365128310068 -0.15581321954177493; … ; -0.3521208550434111 -0.22814552544624836 … -0.20770415442477874 0.07166696164953267; -0.6970256705507138 -0.15581321954177493 … -0.6970256705507138 -0.15581321954177493;;; -2.413653040525908 -1.7186928211396268 … -2.413653040525908 -1.7186928211396268; -1.9779073862294974 -0.028053785497743476 … -0.05251042504995188 -1.3942856234021603; … ; -2.413653040525908 -0.01669002567933338 … -0.044026891631948575 -1.7186928211396268; -1.9779073862294974 -1.3942856234021603 … -1.9779073862294974 -1.3942856234021603]
+ [-0.3590863750002272 0.06598805856519219 … -0.3590863750002272 0.06598805856519219; -0.7031107550673309 -0.2510409346609563 … -0.23402738021341402 -0.16043991156025073; … ; -0.3590863750002272 -0.22867111893081069 … -0.20967527421369125 0.06598805856519219; -0.7031107550673309 -0.16043991156025073 … -0.7031107550673309 -0.16043991156025073;;; -2.416024534868256 -1.723872489579331 … -2.416024534868256 -1.723872489579331; -1.9834413457601845 -0.027429681496909608 … -0.04979949722704688 -1.403004376360536; … ; -2.416024534868256 -0.012727978639355316 … -0.03831240805257915 -1.723872489579331; -1.9834413457601845 -1.403004376360536 … -1.9834413457601845 -1.403004376360536]
+ [-0.3652980205085376 0.06096950392486076 … -0.3652980205085376 0.06096950392486076; -0.7084032158463106 -0.24895698959505633 … -0.2332565481814833 -0.1644037721629653; … ; -0.3652980205085376 -0.22859911461839777 … -0.2109689121025174 0.06096950392486076; -0.7084032158463106 -0.1644037721629653 … -0.7084032158463106 -0.1644037721629653;;; -2.4197773569414047 -1.7304006749449456 … -2.4197773569414047 -1.7304006749449456; -1.9903347484325364 -0.02784369088700459 … -0.04820156586365496 -1.4129330066989474; … ; -2.4197773569414047 -0.009938183248749033 … -0.03374644742324412 -1.7304006749449456; -1.9903347484325364 -1.4129330066989474 … -1.9903347484325364 -1.4129330066989474]
+ [-0.37079634137002254 0.056566824007777634 … -0.37079634137002254 0.056566824007777634; -0.712978650101423 -0.24643040015093676 … -0.2319006320762357 -0.16777870978576348; … ; -0.37079634137002254 -0.22798219939833356 … -0.2116246634276885 0.056566824007777634; -0.712978650101423 -0.16777870978576348 … -0.712978650101423 -0.16777870978576348;;; -2.4248325802875517 -1.738167507524028 … -2.4248325802875517 -1.738167507524028; -1.9984340450617921 -0.029146265694757346 … -0.047594466447352254 -1.4238938738403897; … ; -2.4248325802875517 -0.0082317942377285 … -0.0302723003246664 -1.738167507524028; -1.9984340450617921 -1.4238938738403897 … -1.9984340450617921 -1.4238938738403897]
+ [-0.3756301420976148 0.05273005356731644 … -0.3756301420976148 0.05273005356731644; -0.7169178171593397 -0.24353842434524517 … -0.2300387249620156 -0.1706405509962637; … ; -0.3756301420976148 -0.22687634313714175 … -0.21168989553081277 0.05273005356731644; -0.7169178171593397 -0.1706405509962637 … -0.7169178171593397 -0.1706405509962637;;; -2.431092300940214 -1.7470485803590445 … -2.431092300940214 -1.7470485803590445; -2.0075756948585846 -0.03118012716031498 … -0.04784220836840984 -1.4357065008740522; … ; -2.431092300940214 -0.007502321042711482 … -0.02781217117877902 -1.7470485803590445; -2.0075756948585846 -1.4357065008740522 … -2.0075756948585846 -1.4357065008740522]
+ [-0.37985447595772653 0.04940548238785496 … -0.37985447595772653 0.04940548238785496; -0.7203036773419135 -0.24035309346769054 … -0.22774905685784178 -0.17306463080541906; … ; -0.37985447595772653 -0.22533838987028504 … -0.21121702489250443 0.04940548238785496; -0.7203036773419135 -0.17306463080541906 … -0.7203036773419135 -0.17306463080541906;;; -2.4384439931530535 -1.756909669413564 … -2.4384439931530535 -1.756909669413564; -2.0175922027968425 -0.03378575200165975 … -0.04880045559905625 -1.4481932237374657; … ; -2.4384439931530535 -0.007629985783351074 … -0.02627092263190513 -1.756909669413564; -2.0175922027968425 -1.4481932237374657 … -2.0175922027968425 -1.4481932237374657]
+ [-0.38124295443269 0.048318947816810065 … -0.38124295443269 0.048318947816810065; -0.7214075191431352 -0.23914227277597178 … -0.22683070520154086 -0.17384740055570305; … ; -0.38124295443269 -0.22468695331191318 … -0.210924277835274 0.048318947816810065; -0.7214075191431352 -0.17384740055570305 … -0.7214075191431352 -0.17384740055570305;;; -2.4413467449387483 -1.7606885966448282 … -2.4413467449387483 -1.7606885966448282; -2.0213960714842503 -0.034837801211528435 … -0.04929312067557789 -1.4528396960719592; … ; -2.4413467449387483 -0.007862325088914351 … -0.025919216403936674 -1.7606885966448282; -2.0213960714842503 -1.4528396960719592 … -2.0213960714842503 -1.4528396960719592]
Alternatively, it is also possible to use an in-place formulation
julia f! (du,u,p,t) = right_hand_side! (du, u, Ref ([setup, psolver]), t)
+u = similar (u0)
+du = similar (u0)
+p = nothing
+t = 0.0
+f! (du,u,p,t)
that is usually faster than the out-of-place formulation.
You can look here for more information on how to use the SciML solvers and all the options available.
API `,10)),s("details",g,[s("summary",null,[a[8]||(a[8]=s("a",{id:"IncompressibleNavierStokes.create_right_hand_side-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.create_right_hand_side-Tuple{Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.create_right_hand_side")],-1)),a[9]||(a[9]=t()),Q(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),a[10]||(a[10]=n(`julia create_right_hand_side (
+ setup,
+ psolver
+) -> IncompressibleNavierStokes . var"#right_hand_side#343"
create_right_hand_side(setup, psolver)
Creates a function that computes the right-hand side of the Navier-Stokes equations for a given setup and pressure solver.
Arguments
Returns
A function that computes the right-hand side of the Navier-Stokes equations.
source
`,8))]),s("details",k,[s("summary",null,[a[11]||(a[11]=s("a",{id:"IncompressibleNavierStokes.right_hand_side!-NTuple{4, Any}",href:"#IncompressibleNavierStokes.right_hand_side!-NTuple{4, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.right_hand_side!")],-1)),a[12]||(a[12]=t()),Q(l,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),a[13]||(a[13]=n('julia right_hand_side! (dudt, u, params_ref, t)
right_hand_side!(dudt, u, params_ref, t)
Computes the right-hand side of the Navier-Stokes equations in-place.
Arguments
dudt
: The array to store the computed right-hand side.
u
: The current velocity field.
params_ref
: A reference to the parameters containing the setup and pressure solver.
t
: The current time.
Returns
Nothing. The result is stored in dudt
.
source
',8))])])}const v=T(r,[["render",c]]);export{L as __pageData,v as default};
diff --git a/previews/PR126/assets/manual_setup.md.BQcEIomz.js b/previews/PR126/assets/manual_setup.md.BQcEIomz.js
new file mode 100644
index 00000000..35b8d916
--- /dev/null
+++ b/previews/PR126/assets/manual_setup.md.BQcEIomz.js
@@ -0,0 +1,31 @@
+import{_ as r,c as n,j as s,a as e,G as l,a5 as a,B as d,o}from"./chunks/framework.BSoZtefh.js";const T1=JSON.parse('{"title":"Problem setup","description":"","frontmatter":{},"headers":[],"relativePath":"manual/setup.md","filePath":"manual/setup.md","lastUpdated":null}'),p={name:"manual/setup.md"},Q={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},h={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.288ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1011.4 592","aria-hidden":"true"},L={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.799ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.227ex",height:"1.799ex",role:"img",focusable:"false",viewBox:"0 -442 2310.5 795.1","aria-hidden":"true"},N={class:"jldocstring custom-block",open:""},F={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},Z={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.148ex"},xmlns:"http://www.w3.org/2000/svg",width:"50.685ex",height:"5.428ex",role:"img",focusable:"false",viewBox:"0 -1449.5 22402.7 2399","aria-hidden":"true"},S={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.346ex",height:"2.004ex",role:"img",focusable:"false",viewBox:"0 -846 4131.1 886","aria-hidden":"true"},V={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.12ex",height:"2.664ex",role:"img",focusable:"false",viewBox:"0 -833.9 8893.2 1177.3","aria-hidden":"true"},O={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},P={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.556ex",height:"1.984ex",role:"img",focusable:"false",viewBox:"0 -683 5549.6 877","aria-hidden":"true"},z={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.89ex",height:"1.91ex",role:"img",focusable:"false",viewBox:"0 -694 3045.5 844","aria-hidden":"true"},G={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},J={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.004ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.941ex",height:"2.97ex",role:"img",focusable:"false",viewBox:"0 -868.9 7046 1312.8","aria-hidden":"true"},q={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},U={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.842ex"},xmlns:"http://www.w3.org/2000/svg",width:"40.13ex",height:"4.899ex",role:"img",focusable:"false",viewBox:"0 -1351.5 17737.3 2165.5","aria-hidden":"true"},X={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},K={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.471ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.486ex",height:"1.471ex",role:"img",focusable:"false",viewBox:"0 -442 1982.9 650","aria-hidden":"true"},$={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},s1={class:"jldocstring custom-block",open:""},t1={class:"jldocstring custom-block",open:""},e1={class:"jldocstring custom-block",open:""},a1={class:"jldocstring custom-block",open:""},i1={class:"jldocstring custom-block",open:""};function l1(n1,t,o1,r1,d1,p1){const i=d("Badge");return o(),n("div",null,[t[124]||(t[124]=s("h1",{id:"Problem-setup",tabindex:"-1"},[e("Problem setup "),s("a",{class:"header-anchor",href:"#Problem-setup","aria-label":'Permalink to "Problem setup {#Problem-setup}"'},"")],-1)),t[125]||(t[125]=s("h2",{id:"Boundary-conditions",tabindex:"-1"},[e("Boundary conditions "),s("a",{class:"header-anchor",href:"#Boundary-conditions","aria-label":'Permalink to "Boundary conditions {#Boundary-conditions}"'},"")],-1)),t[126]||(t[126]=s("p",null,"Each boundary has exactly one type of boundary conditions. For periodic boundary conditions, the opposite boundary must also be periodic.",-1)),s("details",Q,[s("summary",null,[t[0]||(t[0]=s("a",{id:"IncompressibleNavierStokes.AbstractBC",href:"#IncompressibleNavierStokes.AbstractBC"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.AbstractBC")],-1)),t[1]||(t[1]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[2]||(t[2]=a('julia abstract type AbstractBC
Boundary condition for one side of the domain.
Fields
source
',4))]),s("details",T,[s("summary",null,[t[3]||(t[3]=s("a",{id:"IncompressibleNavierStokes.DirichletBC",href:"#IncompressibleNavierStokes.DirichletBC"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.DirichletBC")],-1)),t[4]||(t[4]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[5]||(t[5]=a('julia struct DirichletBC{U} <: IncompressibleNavierStokes.AbstractBC
Dirichlet boundary conditions for the velocity, where u[1] = (x..., t) -> u1_BC
up to u[d] = (x..., t) -> ud_BC
, where d
is the dimension.
When u
is nothing
, then the boundary conditions are no slip boundary conditions, where all velocity components are zero.
Fields
source
',6))]),s("details",m,[s("summary",null,[t[6]||(t[6]=s("a",{id:"IncompressibleNavierStokes.PeriodicBC",href:"#IncompressibleNavierStokes.PeriodicBC"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.PeriodicBC")],-1)),t[7]||(t[7]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[8]||(t[8]=a('julia struct PeriodicBC <: IncompressibleNavierStokes.AbstractBC
Periodic boundary conditions. Must be periodic on both sides.
Fields
source
',4))]),s("details",h,[s("summary",null,[t[9]||(t[9]=s("a",{id:"IncompressibleNavierStokes.PressureBC",href:"#IncompressibleNavierStokes.PressureBC"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.PressureBC")],-1)),t[10]||(t[10]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[11]||(t[11]=a('julia struct PressureBC <: IncompressibleNavierStokes.AbstractBC
Pressure boundary conditions. The pressure is prescribed on the boundary (usually an "outlet"). The velocity has zero Neumann conditions.
Note: Currently, the pressure is prescribed with the constant value of zero on the entire boundary.
Fields
source
',5))]),s("details",c,[s("summary",null,[t[12]||(t[12]=s("a",{id:"IncompressibleNavierStokes.SymmetricBC",href:"#IncompressibleNavierStokes.SymmetricBC"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.SymmetricBC")],-1)),t[13]||(t[13]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[14]||(t[14]=a('julia struct SymmetricBC <: IncompressibleNavierStokes.AbstractBC
Symmetric boundary conditions. The parallel velocity and pressure is the same at each side of the boundary. The normal velocity is zero.
Fields
source
',4))]),s("details",g,[s("summary",null,[t[15]||(t[15]=s("a",{id:"IncompressibleNavierStokes.apply_bc_p!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.apply_bc_p!-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.apply_bc_p!")],-1)),t[16]||(t[16]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[17]||(t[17]=a('julia apply_bc_p! (p, t, setup; kwargs ... ) -> Any
Apply pressure boundary conditions (in-place version).
source
',3))]),s("details",k,[s("summary",null,[t[18]||(t[18]=s("a",{id:"IncompressibleNavierStokes.apply_bc_p-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.apply_bc_p-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.apply_bc_p")],-1)),t[19]||(t[19]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[20]||(t[20]=a('julia apply_bc_p (p, t, setup; kwargs ... ) -> Any
Apply pressure boundary conditions (differentiable version).
source
',3))]),s("details",u,[s("summary",null,[t[21]||(t[21]=s("a",{id:"IncompressibleNavierStokes.apply_bc_temp!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.apply_bc_temp!-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.apply_bc_temp!")],-1)),t[22]||(t[22]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[23]||(t[23]=a('julia apply_bc_temp! (temp, t, setup; kwargs ... ) -> Any
Apply temperature boundary conditions (in-place version).
source
',3))]),s("details",b,[s("summary",null,[t[24]||(t[24]=s("a",{id:"IncompressibleNavierStokes.apply_bc_temp-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.apply_bc_temp-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.apply_bc_temp")],-1)),t[25]||(t[25]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[26]||(t[26]=a('julia apply_bc_temp (temp, t, setup; kwargs ... ) -> Any
Apply temperature boundary conditions (differentiable version).
source
',3))]),s("details",y,[s("summary",null,[t[27]||(t[27]=s("a",{id:"IncompressibleNavierStokes.apply_bc_u!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.apply_bc_u!-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.apply_bc_u!")],-1)),t[28]||(t[28]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[29]||(t[29]=a('julia apply_bc_u! (u, t, setup; kwargs ... ) -> Any
Apply velocity boundary conditions (in-place version).
source
',3))]),s("details",f,[s("summary",null,[t[30]||(t[30]=s("a",{id:"IncompressibleNavierStokes.apply_bc_u-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.apply_bc_u-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.apply_bc_u")],-1)),t[31]||(t[31]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[32]||(t[32]=a('julia apply_bc_u (u, t, setup; kwargs ... ) -> Any
Apply velocity boundary conditions (differentiable version).
source
',3))]),s("details",v,[s("summary",null,[t[33]||(t[33]=s("a",{id:"IncompressibleNavierStokes.boundary-NTuple{4, Any}",href:"#IncompressibleNavierStokes.boundary-NTuple{4, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.boundary")],-1)),t[34]||(t[34]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[35]||(t[35]=a('julia boundary (β, N, I, isright) -> Any
Get boundary indices of boundary layer normal to β
. The CartesianIndices
given by I
should contain those of the inner DOFs, typically Ip
or Iu[α]
. The boundary layer is then just outside those.
source
',3))]),s("details",E,[s("summary",null,[t[36]||(t[36]=s("a",{id:"IncompressibleNavierStokes.offset_p",href:"#IncompressibleNavierStokes.offset_p"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.offset_p")],-1)),t[37]||(t[37]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[38]||(t[38]=a('julia offset_p (bc, isnormal, isright)
Number of non-DOF pressure components at boundary.
source
',3))]),s("details",x,[s("summary",null,[t[39]||(t[39]=s("a",{id:"IncompressibleNavierStokes.offset_u",href:"#IncompressibleNavierStokes.offset_u"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.offset_u")],-1)),t[40]||(t[40]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[41]||(t[41]=a('julia offset_u (bc, isnormal, isright)
Number of non-DOF velocity components at boundary. If isnormal
, then the velocity is normal to the boundary, else parallel. If isright
, it is at the end/right/rear/top boundary, otherwise beginning.
source
',3))]),t[127]||(t[127]=s("h2",{id:"grid",tabindex:"-1"},[e("Grid "),s("a",{class:"header-anchor",href:"#grid","aria-label":'Permalink to "Grid"'},"")],-1)),s("details",w,[s("summary",null,[t[42]||(t[42]=s("a",{id:"IncompressibleNavierStokes.Dimension",href:"#IncompressibleNavierStokes.Dimension"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.Dimension")],-1)),t[43]||(t[43]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[44]||(t[44]=a(`Represent an N
-dimensional space. Returns N
when called.
julia julia > d = Dimension ( 3 )
+Dimension{3} ()
+
+julia > d ()
+3
Fields
source
`,5))]),s("details",j,[s("summary",null,[t[45]||(t[45]=s("a",{id:"IncompressibleNavierStokes.Grid-Tuple{}",href:"#IncompressibleNavierStokes.Grid-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.Grid")],-1)),t[46]||(t[46]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[55]||(t[55]=a('julia Grid (; x, boundary_conditions, backend)
Create useful quantities for Cartesian box mesh ``x[1] \\times \\dots \\times x[d]with boundary conditions
boundary_conditions. Return a named tuple (
[α]` denotes a tuple index) with the following fields:
',2)),s("ul",null,[t[54]||(t[54]=a("N[α]
: Number of finite volumes in direction β
, including ghost volumes
Nu[α][β]
: Number of u[α]
velocity DOFs in direction β
Np[α]
: Number of pressure DOFs in direction α
Iu[α]
: Cartesian index range of u[α]
velocity DOFs
Ip
: Cartesian index range of pressure DOFs
xlims[α]
: Tuple containing the limits of the physical domain (not grid) in the direction α
x[α]
: α-coordinates of all volume boundaries, including the left point of the first ghost volume
xu[α][β]
: β-coordinates of u[α]
velocity points
xp[α]
: α-coordinates of pressure points
Δ[α]
: All volume widths in direction α
Δu[α]
: Distance between pressure points in direction α
",11)),s("li",null,[s("p",null,[t[51]||(t[51]=s("code",null,"A[α][β]",-1)),t[52]||(t[52]=e(": Interpolation weights from α-face centers ")),s("mjx-container",H,[(o(),n("svg",M,t[47]||(t[47]=[a(' ',1)]))),t[48]||(t[48]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("msub",null,[s("mi",null,"x"),s("mi",null,"I")])])],-1))]),t[53]||(t[53]=e(" to ")),s("mjx-container",L,[(o(),n("svg",C,t[49]||(t[49]=[a(' ',1)]))),t[50]||(t[50]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("msub",null,[s("mi",null,"x"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"I"),s("mo",null,"±"),s("msub",null,[s("mi",null,"h"),s("mi",null,"β")])])])])],-1))])])])]),t[56]||(t[56]=s("p",null,"Note that the memory footprint of the redundant 1D-arrays above is negligible compared to the memory footprint of the 2D/3D-fields used in the code.",-1)),t[57]||(t[57]=s("p",null,[s("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/grid.jl#L79",target:"_blank",rel:"noreferrer"},"source")],-1))]),s("details",N,[s("summary",null,[t[58]||(t[58]=s("a",{id:"IncompressibleNavierStokes.cosine_grid-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.cosine_grid-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.cosine_grid")],-1)),t[59]||(t[59]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[62]||(t[62]=a('julia cosine_grid (a, b, N) -> Any
Create a nonuniform grid of N + 1
points from a
to b
using a cosine profile, i.e.
',2)),s("mjx-container",F,[(o(),n("svg",Z,t[60]||(t[60]=[a(' ',1)]))),t[61]||(t[61]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("msub",null,[s("mi",null,"x"),s("mi",null,"i")]),s("mo",null,"="),s("mi",null,"a"),s("mo",null,"+"),s("mfrac",null,[s("mn",null,"1"),s("mn",null,"2")]),s("mrow",{"data-mjx-texclass":"INNER"},[s("mo",{"data-mjx-texclass":"OPEN"},"("),s("mn",null,"1"),s("mo",null,"−"),s("mi",null,"cos"),s("mo",{"data-mjx-texclass":"NONE"},""),s("mrow",{"data-mjx-texclass":"INNER"},[s("mo",{"data-mjx-texclass":"OPEN"},"("),s("mi",null,"π"),s("mfrac",null,[s("mi",null,"i"),s("mi",null,"n")]),s("mo",{"data-mjx-texclass":"CLOSE"},")")]),s("mo",{"data-mjx-texclass":"CLOSE"},")")]),s("mo",{stretchy:"false"},"("),s("mi",null,"b"),s("mo",null,"−"),s("mi",null,"a"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mstyle",{scriptlevel:"0"},[s("mspace",{width:"1em"})]),s("mi",null,"i"),s("mo",null,"="),s("mn",null,"0"),s("mo",null,","),s("mo",null,"…"),s("mo",null,","),s("mi",null,"N")])],-1))]),t[63]||(t[63]=s("p",null,[e("See also "),s("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/manual/setup#IncompressibleNavierStokes.stretched_grid"},[s("code",null,"stretched_grid")]),e(".")],-1)),t[64]||(t[64]=s("p",null,[s("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/grid.jl#L28",target:"_blank",rel:"noreferrer"},"source")],-1))]),s("details",S,[s("summary",null,[t[65]||(t[65]=s("a",{id:"IncompressibleNavierStokes.max_size-Tuple{Any}",href:"#IncompressibleNavierStokes.max_size-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.max_size")],-1)),t[66]||(t[66]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[67]||(t[67]=a('julia max_size (grid) -> Any
Get size of the largest grid element.
source
',3))]),s("details",A,[s("summary",null,[t[68]||(t[68]=s("a",{id:"IncompressibleNavierStokes.stretched_grid",href:"#IncompressibleNavierStokes.stretched_grid"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.stretched_grid")],-1)),t[69]||(t[69]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[94]||(t[94]=a(`julia stretched_grid (a, b, N) -> Any
+stretched_grid (a, b, N, s) -> Any
`,1)),s("p",null,[t[80]||(t[80]=a("Create a nonuniform grid of N + 1
points from a
to b
with a stretch factor of s
. If s = 1
, return a uniform spacing from a
to b
. Otherwise, return a vector ",15)),s("mjx-container",D,[(o(),n("svg",I,t[70]||(t[70]=[a(' ',1)]))),t[71]||(t[71]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x"),s("mo",null,"∈"),s("msup",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"double-struck"},"R")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"N"),s("mo",null,"+"),s("mn",null,"1")])])])],-1))]),t[81]||(t[81]=e(" such that ")),s("mjx-container",V,[(o(),n("svg",B,t[72]||(t[72]=[a(' ',1)]))),t[73]||(t[73]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("msub",null,[s("mi",null,"x"),s("mi",null,"n")]),s("mo",null,"="),s("mi",null,"a"),s("mo",null,"+"),s("munderover",null,[s("mo",{"data-mjx-texclass":"OP"},"∑"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"i"),s("mo",null,"="),s("mn",null,"1")]),s("mi",null,"n")]),s("msup",null,[s("mi",null,"s"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"i"),s("mo",null,"−"),s("mn",null,"1")])]),s("mi",null,"h")])],-1))]),t[82]||(t[82]=e(" for ")),s("mjx-container",O,[(o(),n("svg",P,t[74]||(t[74]=[a(' ',1)]))),t[75]||(t[75]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"n"),s("mo",null,"="),s("mn",null,"0"),s("mo",null,","),s("mo",null,"…"),s("mo",null,","),s("mi",null,"N")])],-1))]),t[83]||(t[83]=e(". Setting ")),s("mjx-container",z,[(o(),n("svg",R,t[76]||(t[76]=[a(' ',1)]))),t[77]||(t[77]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("msub",null,[s("mi",null,"x"),s("mi",null,"N")]),s("mo",null,"="),s("mi",null,"b")])],-1))]),t[84]||(t[84]=e(" then gives ")),s("mjx-container",G,[(o(),n("svg",J,t[78]||(t[78]=[a(' ',1)]))),t[79]||(t[79]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"h"),s("mo",null,"="),s("mo",{stretchy:"false"},"("),s("mi",null,"b"),s("mo",null,"−"),s("mi",null,"a"),s("mo",{stretchy:"false"},")"),s("mfrac",null,[s("mrow",null,[s("mn",null,"1"),s("mo",null,"−"),s("mi",null,"s")]),s("mrow",null,[s("mn",null,"1"),s("mo",null,"−"),s("msup",null,[s("mi",null,"s"),s("mi",null,"N")])])])])],-1))]),t[85]||(t[85]=e(", resulting in"))]),s("mjx-container",q,[(o(),n("svg",U,t[86]||(t[86]=[a(' ',1)]))),t[87]||(t[87]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("msub",null,[s("mi",null,"x"),s("mi",null,"n")]),s("mo",null,"="),s("mi",null,"a"),s("mo",null,"+"),s("mo",{stretchy:"false"},"("),s("mi",null,"b"),s("mo",null,"−"),s("mi",null,"a"),s("mo",{stretchy:"false"},")"),s("mfrac",null,[s("mrow",null,[s("mn",null,"1"),s("mo",null,"−"),s("msup",null,[s("mi",null,"s"),s("mi",null,"n")])]),s("mrow",null,[s("mn",null,"1"),s("mo",null,"−"),s("msup",null,[s("mi",null,"s"),s("mi",null,"N")])])]),s("mo",null,","),s("mstyle",{scriptlevel:"0"},[s("mspace",{width:"1em"})]),s("mi",null,"n"),s("mo",null,"="),s("mn",null,"0"),s("mo",null,","),s("mo",null,"…"),s("mo",null,","),s("mi",null,"N"),s("mo",null,".")])],-1))]),s("p",null,[t[90]||(t[90]=e("Note that ")),t[91]||(t[91]=s("code",null,"stretched_grid(a, b, N, s)[n]",-1)),t[92]||(t[92]=e(" corresponds to ")),s("mjx-container",X,[(o(),n("svg",K,t[88]||(t[88]=[a(' ',1)]))),t[89]||(t[89]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("msub",null,[s("mi",null,"x"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"n"),s("mo",null,"−"),s("mn",null,"1")])])])],-1))]),t[93]||(t[93]=e("."))]),t[95]||(t[95]=s("p",null,[e("See also "),s("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/manual/setup#IncompressibleNavierStokes.cosine_grid-Tuple{Any, Any, Any}"},[s("code",null,"cosine_grid")]),e(".")],-1)),t[96]||(t[96]=s("p",null,[s("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/grid.jl#L45",target:"_blank",rel:"noreferrer"},"source")],-1))]),s("details",$,[s("summary",null,[t[97]||(t[97]=s("a",{id:"IncompressibleNavierStokes.tanh_grid",href:"#IncompressibleNavierStokes.tanh_grid"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.tanh_grid")],-1)),t[98]||(t[98]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[99]||(t[99]=a(`julia tanh_grid (a, b, N) -> Any
+tanh_grid (a, b, N, γ) -> Any
Create a nonuniform grid of N + 1
points from a
to b
, as proposed by Trias et al. [10 ].
source
`,3))]),t[128]||(t[128]=s("h2",{id:"setup",tabindex:"-1"},[e("Setup "),s("a",{class:"header-anchor",href:"#setup","aria-label":'Permalink to "Setup"'},"")],-1)),s("details",W,[s("summary",null,[t[100]||(t[100]=s("a",{id:"KernelAbstractions.CPU",href:"#KernelAbstractions.CPU"},[s("span",{class:"jlbinding"},"KernelAbstractions.CPU")],-1)),t[101]||(t[101]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[102]||(t[102]=a('julia struct CPU <: KernelAbstractions.Backend
Instantiate a CPU (multi-threaded) backend.
Options:
static
: Uses a static thread assignment, this can be beneficial for NUMA aware code. Defaults to false.Fields
source
',8))]),s("details",Y,[s("summary",null,[t[103]||(t[103]=s("a",{id:"IncompressibleNavierStokes.Setup-Tuple{}",href:"#IncompressibleNavierStokes.Setup-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.Setup")],-1)),t[104]||(t[104]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[105]||(t[105]=a(`julia Setup (
+;
+ x,
+ boundary_conditions,
+ bodyforce,
+ dbodyforce,
+ issteadybodyforce,
+ closure_model,
+ backend,
+ workgroupsize,
+ temperature,
+ Re
+)
Create problem setup (stored in a named tuple).
source
`,3))]),s("details",_,[s("summary",null,[t[106]||(t[106]=s("a",{id:"IncompressibleNavierStokes.temperature_equation-Tuple{}",href:"#IncompressibleNavierStokes.temperature_equation-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.temperature_equation")],-1)),t[107]||(t[107]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[108]||(t[108]=a(`julia temperature_equation (
+;
+ Pr,
+ Ra,
+ Ge,
+ dodissipation,
+ boundary_conditions,
+ gdir,
+ nondim_type
+)
Create temperature equation setup (stored in a named tuple).
The equation is parameterized by three dimensionless numbers (Prandtl number, Rayleigh number, and Gebhart number), and requires separate boundary conditions for the temperature
field. The gdir
keyword specifies the direction gravity, while non_dim_type
specifies the type of non-dimensionalization.
source
`,4))]),t[129]||(t[129]=s("h2",{id:"Field-initializers",tabindex:"-1"},[e("Field initializers "),s("a",{class:"header-anchor",href:"#Field-initializers","aria-label":'Permalink to "Field initializers {#Field-initializers}"'},"")],-1)),s("details",s1,[s("summary",null,[t[109]||(t[109]=s("a",{id:"IncompressibleNavierStokes.random_field",href:"#IncompressibleNavierStokes.random_field"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.random_field")],-1)),t[110]||(t[110]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[111]||(t[111]=a(`julia random_field (setup; ... ) -> Any
+random_field (setup, t; A, kp, psolver, rng) -> Any
Create random field, as in [11 ].
source
`,4))]),s("details",t1,[s("summary",null,[t[112]||(t[112]=s("a",{id:"IncompressibleNavierStokes.scalarfield-Tuple{Any}",href:"#IncompressibleNavierStokes.scalarfield-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.scalarfield")],-1)),t[113]||(t[113]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[114]||(t[114]=a('julia scalarfield (setup) -> Any
Create empty scalar field.
source
',3))]),s("details",e1,[s("summary",null,[t[115]||(t[115]=s("a",{id:"IncompressibleNavierStokes.temperaturefield",href:"#IncompressibleNavierStokes.temperaturefield"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.temperaturefield")],-1)),t[116]||(t[116]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[117]||(t[117]=a(`julia temperaturefield (setup, tempfunc) -> Any
+temperaturefield (setup, tempfunc, t) -> Any
Create temperature field from function with boundary conditions at time t
.
source
`,3))]),s("details",a1,[s("summary",null,[t[118]||(t[118]=s("a",{id:"IncompressibleNavierStokes.vectorfield-Tuple{Any}",href:"#IncompressibleNavierStokes.vectorfield-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.vectorfield")],-1)),t[119]||(t[119]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[120]||(t[120]=a('julia vectorfield (setup) -> Any
Create empty vector field.
source
',3))]),s("details",i1,[s("summary",null,[t[121]||(t[121]=s("a",{id:"IncompressibleNavierStokes.velocityfield",href:"#IncompressibleNavierStokes.velocityfield"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.velocityfield")],-1)),t[122]||(t[122]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[123]||(t[123]=a(`julia velocityfield (setup, ufunc; ... ) -> Any
+velocityfield (setup, ufunc, t; psolver, doproject) -> Any
Create divergence free velocity field u
with boundary conditions at time t
. The initial conditions of u[α]
are specified by the function ufunc(α, x...)
.
source
`,3))])])}const m1=r(p,[["render",l1]]);export{T1 as __pageData,m1 as default};
diff --git a/previews/PR126/assets/manual_setup.md.BQcEIomz.lean.js b/previews/PR126/assets/manual_setup.md.BQcEIomz.lean.js
new file mode 100644
index 00000000..35b8d916
--- /dev/null
+++ b/previews/PR126/assets/manual_setup.md.BQcEIomz.lean.js
@@ -0,0 +1,31 @@
+import{_ as r,c as n,j as s,a as e,G as l,a5 as a,B as d,o}from"./chunks/framework.BSoZtefh.js";const T1=JSON.parse('{"title":"Problem setup","description":"","frontmatter":{},"headers":[],"relativePath":"manual/setup.md","filePath":"manual/setup.md","lastUpdated":null}'),p={name:"manual/setup.md"},Q={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},h={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},u={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.288ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1011.4 592","aria-hidden":"true"},L={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.799ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.227ex",height:"1.799ex",role:"img",focusable:"false",viewBox:"0 -442 2310.5 795.1","aria-hidden":"true"},N={class:"jldocstring custom-block",open:""},F={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},Z={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.148ex"},xmlns:"http://www.w3.org/2000/svg",width:"50.685ex",height:"5.428ex",role:"img",focusable:"false",viewBox:"0 -1449.5 22402.7 2399","aria-hidden":"true"},S={class:"jldocstring custom-block",open:""},A={class:"jldocstring custom-block",open:""},D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.346ex",height:"2.004ex",role:"img",focusable:"false",viewBox:"0 -846 4131.1 886","aria-hidden":"true"},V={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.12ex",height:"2.664ex",role:"img",focusable:"false",viewBox:"0 -833.9 8893.2 1177.3","aria-hidden":"true"},O={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},P={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.556ex",height:"1.984ex",role:"img",focusable:"false",viewBox:"0 -683 5549.6 877","aria-hidden":"true"},z={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.89ex",height:"1.91ex",role:"img",focusable:"false",viewBox:"0 -694 3045.5 844","aria-hidden":"true"},G={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},J={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.004ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.941ex",height:"2.97ex",role:"img",focusable:"false",viewBox:"0 -868.9 7046 1312.8","aria-hidden":"true"},q={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},U={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.842ex"},xmlns:"http://www.w3.org/2000/svg",width:"40.13ex",height:"4.899ex",role:"img",focusable:"false",viewBox:"0 -1351.5 17737.3 2165.5","aria-hidden":"true"},X={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},K={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.471ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.486ex",height:"1.471ex",role:"img",focusable:"false",viewBox:"0 -442 1982.9 650","aria-hidden":"true"},$={class:"jldocstring custom-block",open:""},W={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},s1={class:"jldocstring custom-block",open:""},t1={class:"jldocstring custom-block",open:""},e1={class:"jldocstring custom-block",open:""},a1={class:"jldocstring custom-block",open:""},i1={class:"jldocstring custom-block",open:""};function l1(n1,t,o1,r1,d1,p1){const i=d("Badge");return o(),n("div",null,[t[124]||(t[124]=s("h1",{id:"Problem-setup",tabindex:"-1"},[e("Problem setup "),s("a",{class:"header-anchor",href:"#Problem-setup","aria-label":'Permalink to "Problem setup {#Problem-setup}"'},"")],-1)),t[125]||(t[125]=s("h2",{id:"Boundary-conditions",tabindex:"-1"},[e("Boundary conditions "),s("a",{class:"header-anchor",href:"#Boundary-conditions","aria-label":'Permalink to "Boundary conditions {#Boundary-conditions}"'},"")],-1)),t[126]||(t[126]=s("p",null,"Each boundary has exactly one type of boundary conditions. For periodic boundary conditions, the opposite boundary must also be periodic.",-1)),s("details",Q,[s("summary",null,[t[0]||(t[0]=s("a",{id:"IncompressibleNavierStokes.AbstractBC",href:"#IncompressibleNavierStokes.AbstractBC"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.AbstractBC")],-1)),t[1]||(t[1]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[2]||(t[2]=a('julia abstract type AbstractBC
Boundary condition for one side of the domain.
Fields
source
',4))]),s("details",T,[s("summary",null,[t[3]||(t[3]=s("a",{id:"IncompressibleNavierStokes.DirichletBC",href:"#IncompressibleNavierStokes.DirichletBC"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.DirichletBC")],-1)),t[4]||(t[4]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[5]||(t[5]=a('julia struct DirichletBC{U} <: IncompressibleNavierStokes.AbstractBC
Dirichlet boundary conditions for the velocity, where u[1] = (x..., t) -> u1_BC
up to u[d] = (x..., t) -> ud_BC
, where d
is the dimension.
When u
is nothing
, then the boundary conditions are no slip boundary conditions, where all velocity components are zero.
Fields
source
',6))]),s("details",m,[s("summary",null,[t[6]||(t[6]=s("a",{id:"IncompressibleNavierStokes.PeriodicBC",href:"#IncompressibleNavierStokes.PeriodicBC"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.PeriodicBC")],-1)),t[7]||(t[7]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[8]||(t[8]=a('julia struct PeriodicBC <: IncompressibleNavierStokes.AbstractBC
Periodic boundary conditions. Must be periodic on both sides.
Fields
source
',4))]),s("details",h,[s("summary",null,[t[9]||(t[9]=s("a",{id:"IncompressibleNavierStokes.PressureBC",href:"#IncompressibleNavierStokes.PressureBC"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.PressureBC")],-1)),t[10]||(t[10]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[11]||(t[11]=a('julia struct PressureBC <: IncompressibleNavierStokes.AbstractBC
Pressure boundary conditions. The pressure is prescribed on the boundary (usually an "outlet"). The velocity has zero Neumann conditions.
Note: Currently, the pressure is prescribed with the constant value of zero on the entire boundary.
Fields
source
',5))]),s("details",c,[s("summary",null,[t[12]||(t[12]=s("a",{id:"IncompressibleNavierStokes.SymmetricBC",href:"#IncompressibleNavierStokes.SymmetricBC"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.SymmetricBC")],-1)),t[13]||(t[13]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[14]||(t[14]=a('julia struct SymmetricBC <: IncompressibleNavierStokes.AbstractBC
Symmetric boundary conditions. The parallel velocity and pressure is the same at each side of the boundary. The normal velocity is zero.
Fields
source
',4))]),s("details",g,[s("summary",null,[t[15]||(t[15]=s("a",{id:"IncompressibleNavierStokes.apply_bc_p!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.apply_bc_p!-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.apply_bc_p!")],-1)),t[16]||(t[16]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[17]||(t[17]=a('julia apply_bc_p! (p, t, setup; kwargs ... ) -> Any
Apply pressure boundary conditions (in-place version).
source
',3))]),s("details",k,[s("summary",null,[t[18]||(t[18]=s("a",{id:"IncompressibleNavierStokes.apply_bc_p-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.apply_bc_p-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.apply_bc_p")],-1)),t[19]||(t[19]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[20]||(t[20]=a('julia apply_bc_p (p, t, setup; kwargs ... ) -> Any
Apply pressure boundary conditions (differentiable version).
source
',3))]),s("details",u,[s("summary",null,[t[21]||(t[21]=s("a",{id:"IncompressibleNavierStokes.apply_bc_temp!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.apply_bc_temp!-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.apply_bc_temp!")],-1)),t[22]||(t[22]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[23]||(t[23]=a('julia apply_bc_temp! (temp, t, setup; kwargs ... ) -> Any
Apply temperature boundary conditions (in-place version).
source
',3))]),s("details",b,[s("summary",null,[t[24]||(t[24]=s("a",{id:"IncompressibleNavierStokes.apply_bc_temp-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.apply_bc_temp-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.apply_bc_temp")],-1)),t[25]||(t[25]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[26]||(t[26]=a('julia apply_bc_temp (temp, t, setup; kwargs ... ) -> Any
Apply temperature boundary conditions (differentiable version).
source
',3))]),s("details",y,[s("summary",null,[t[27]||(t[27]=s("a",{id:"IncompressibleNavierStokes.apply_bc_u!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.apply_bc_u!-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.apply_bc_u!")],-1)),t[28]||(t[28]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[29]||(t[29]=a('julia apply_bc_u! (u, t, setup; kwargs ... ) -> Any
Apply velocity boundary conditions (in-place version).
source
',3))]),s("details",f,[s("summary",null,[t[30]||(t[30]=s("a",{id:"IncompressibleNavierStokes.apply_bc_u-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.apply_bc_u-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.apply_bc_u")],-1)),t[31]||(t[31]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[32]||(t[32]=a('julia apply_bc_u (u, t, setup; kwargs ... ) -> Any
Apply velocity boundary conditions (differentiable version).
source
',3))]),s("details",v,[s("summary",null,[t[33]||(t[33]=s("a",{id:"IncompressibleNavierStokes.boundary-NTuple{4, Any}",href:"#IncompressibleNavierStokes.boundary-NTuple{4, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.boundary")],-1)),t[34]||(t[34]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[35]||(t[35]=a('julia boundary (β, N, I, isright) -> Any
Get boundary indices of boundary layer normal to β
. The CartesianIndices
given by I
should contain those of the inner DOFs, typically Ip
or Iu[α]
. The boundary layer is then just outside those.
source
',3))]),s("details",E,[s("summary",null,[t[36]||(t[36]=s("a",{id:"IncompressibleNavierStokes.offset_p",href:"#IncompressibleNavierStokes.offset_p"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.offset_p")],-1)),t[37]||(t[37]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[38]||(t[38]=a('julia offset_p (bc, isnormal, isright)
Number of non-DOF pressure components at boundary.
source
',3))]),s("details",x,[s("summary",null,[t[39]||(t[39]=s("a",{id:"IncompressibleNavierStokes.offset_u",href:"#IncompressibleNavierStokes.offset_u"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.offset_u")],-1)),t[40]||(t[40]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[41]||(t[41]=a('julia offset_u (bc, isnormal, isright)
Number of non-DOF velocity components at boundary. If isnormal
, then the velocity is normal to the boundary, else parallel. If isright
, it is at the end/right/rear/top boundary, otherwise beginning.
source
',3))]),t[127]||(t[127]=s("h2",{id:"grid",tabindex:"-1"},[e("Grid "),s("a",{class:"header-anchor",href:"#grid","aria-label":'Permalink to "Grid"'},"")],-1)),s("details",w,[s("summary",null,[t[42]||(t[42]=s("a",{id:"IncompressibleNavierStokes.Dimension",href:"#IncompressibleNavierStokes.Dimension"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.Dimension")],-1)),t[43]||(t[43]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[44]||(t[44]=a(`Represent an N
-dimensional space. Returns N
when called.
julia julia > d = Dimension ( 3 )
+Dimension{3} ()
+
+julia > d ()
+3
Fields
source
`,5))]),s("details",j,[s("summary",null,[t[45]||(t[45]=s("a",{id:"IncompressibleNavierStokes.Grid-Tuple{}",href:"#IncompressibleNavierStokes.Grid-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.Grid")],-1)),t[46]||(t[46]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[55]||(t[55]=a('julia Grid (; x, boundary_conditions, backend)
Create useful quantities for Cartesian box mesh ``x[1] \\times \\dots \\times x[d]with boundary conditions
boundary_conditions. Return a named tuple (
[α]` denotes a tuple index) with the following fields:
',2)),s("ul",null,[t[54]||(t[54]=a("N[α]
: Number of finite volumes in direction β
, including ghost volumes
Nu[α][β]
: Number of u[α]
velocity DOFs in direction β
Np[α]
: Number of pressure DOFs in direction α
Iu[α]
: Cartesian index range of u[α]
velocity DOFs
Ip
: Cartesian index range of pressure DOFs
xlims[α]
: Tuple containing the limits of the physical domain (not grid) in the direction α
x[α]
: α-coordinates of all volume boundaries, including the left point of the first ghost volume
xu[α][β]
: β-coordinates of u[α]
velocity points
xp[α]
: α-coordinates of pressure points
Δ[α]
: All volume widths in direction α
Δu[α]
: Distance between pressure points in direction α
",11)),s("li",null,[s("p",null,[t[51]||(t[51]=s("code",null,"A[α][β]",-1)),t[52]||(t[52]=e(": Interpolation weights from α-face centers ")),s("mjx-container",H,[(o(),n("svg",M,t[47]||(t[47]=[a(' ',1)]))),t[48]||(t[48]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("msub",null,[s("mi",null,"x"),s("mi",null,"I")])])],-1))]),t[53]||(t[53]=e(" to ")),s("mjx-container",L,[(o(),n("svg",C,t[49]||(t[49]=[a(' ',1)]))),t[50]||(t[50]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("msub",null,[s("mi",null,"x"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"I"),s("mo",null,"±"),s("msub",null,[s("mi",null,"h"),s("mi",null,"β")])])])])],-1))])])])]),t[56]||(t[56]=s("p",null,"Note that the memory footprint of the redundant 1D-arrays above is negligible compared to the memory footprint of the 2D/3D-fields used in the code.",-1)),t[57]||(t[57]=s("p",null,[s("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/grid.jl#L79",target:"_blank",rel:"noreferrer"},"source")],-1))]),s("details",N,[s("summary",null,[t[58]||(t[58]=s("a",{id:"IncompressibleNavierStokes.cosine_grid-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.cosine_grid-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.cosine_grid")],-1)),t[59]||(t[59]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[62]||(t[62]=a('julia cosine_grid (a, b, N) -> Any
Create a nonuniform grid of N + 1
points from a
to b
using a cosine profile, i.e.
',2)),s("mjx-container",F,[(o(),n("svg",Z,t[60]||(t[60]=[a(' ',1)]))),t[61]||(t[61]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("msub",null,[s("mi",null,"x"),s("mi",null,"i")]),s("mo",null,"="),s("mi",null,"a"),s("mo",null,"+"),s("mfrac",null,[s("mn",null,"1"),s("mn",null,"2")]),s("mrow",{"data-mjx-texclass":"INNER"},[s("mo",{"data-mjx-texclass":"OPEN"},"("),s("mn",null,"1"),s("mo",null,"−"),s("mi",null,"cos"),s("mo",{"data-mjx-texclass":"NONE"},""),s("mrow",{"data-mjx-texclass":"INNER"},[s("mo",{"data-mjx-texclass":"OPEN"},"("),s("mi",null,"π"),s("mfrac",null,[s("mi",null,"i"),s("mi",null,"n")]),s("mo",{"data-mjx-texclass":"CLOSE"},")")]),s("mo",{"data-mjx-texclass":"CLOSE"},")")]),s("mo",{stretchy:"false"},"("),s("mi",null,"b"),s("mo",null,"−"),s("mi",null,"a"),s("mo",{stretchy:"false"},")"),s("mo",null,","),s("mstyle",{scriptlevel:"0"},[s("mspace",{width:"1em"})]),s("mi",null,"i"),s("mo",null,"="),s("mn",null,"0"),s("mo",null,","),s("mo",null,"…"),s("mo",null,","),s("mi",null,"N")])],-1))]),t[63]||(t[63]=s("p",null,[e("See also "),s("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/manual/setup#IncompressibleNavierStokes.stretched_grid"},[s("code",null,"stretched_grid")]),e(".")],-1)),t[64]||(t[64]=s("p",null,[s("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/grid.jl#L28",target:"_blank",rel:"noreferrer"},"source")],-1))]),s("details",S,[s("summary",null,[t[65]||(t[65]=s("a",{id:"IncompressibleNavierStokes.max_size-Tuple{Any}",href:"#IncompressibleNavierStokes.max_size-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.max_size")],-1)),t[66]||(t[66]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[67]||(t[67]=a('julia max_size (grid) -> Any
Get size of the largest grid element.
source
',3))]),s("details",A,[s("summary",null,[t[68]||(t[68]=s("a",{id:"IncompressibleNavierStokes.stretched_grid",href:"#IncompressibleNavierStokes.stretched_grid"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.stretched_grid")],-1)),t[69]||(t[69]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[94]||(t[94]=a(`julia stretched_grid (a, b, N) -> Any
+stretched_grid (a, b, N, s) -> Any
`,1)),s("p",null,[t[80]||(t[80]=a("Create a nonuniform grid of N + 1
points from a
to b
with a stretch factor of s
. If s = 1
, return a uniform spacing from a
to b
. Otherwise, return a vector ",15)),s("mjx-container",D,[(o(),n("svg",I,t[70]||(t[70]=[a(' ',1)]))),t[71]||(t[71]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"x"),s("mo",null,"∈"),s("msup",null,[s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"double-struck"},"R")]),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"N"),s("mo",null,"+"),s("mn",null,"1")])])])],-1))]),t[81]||(t[81]=e(" such that ")),s("mjx-container",V,[(o(),n("svg",B,t[72]||(t[72]=[a(' ',1)]))),t[73]||(t[73]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("msub",null,[s("mi",null,"x"),s("mi",null,"n")]),s("mo",null,"="),s("mi",null,"a"),s("mo",null,"+"),s("munderover",null,[s("mo",{"data-mjx-texclass":"OP"},"∑"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"i"),s("mo",null,"="),s("mn",null,"1")]),s("mi",null,"n")]),s("msup",null,[s("mi",null,"s"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"i"),s("mo",null,"−"),s("mn",null,"1")])]),s("mi",null,"h")])],-1))]),t[82]||(t[82]=e(" for ")),s("mjx-container",O,[(o(),n("svg",P,t[74]||(t[74]=[a(' ',1)]))),t[75]||(t[75]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"n"),s("mo",null,"="),s("mn",null,"0"),s("mo",null,","),s("mo",null,"…"),s("mo",null,","),s("mi",null,"N")])],-1))]),t[83]||(t[83]=e(". Setting ")),s("mjx-container",z,[(o(),n("svg",R,t[76]||(t[76]=[a(' ',1)]))),t[77]||(t[77]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("msub",null,[s("mi",null,"x"),s("mi",null,"N")]),s("mo",null,"="),s("mi",null,"b")])],-1))]),t[84]||(t[84]=e(" then gives ")),s("mjx-container",G,[(o(),n("svg",J,t[78]||(t[78]=[a(' ',1)]))),t[79]||(t[79]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"h"),s("mo",null,"="),s("mo",{stretchy:"false"},"("),s("mi",null,"b"),s("mo",null,"−"),s("mi",null,"a"),s("mo",{stretchy:"false"},")"),s("mfrac",null,[s("mrow",null,[s("mn",null,"1"),s("mo",null,"−"),s("mi",null,"s")]),s("mrow",null,[s("mn",null,"1"),s("mo",null,"−"),s("msup",null,[s("mi",null,"s"),s("mi",null,"N")])])])])],-1))]),t[85]||(t[85]=e(", resulting in"))]),s("mjx-container",q,[(o(),n("svg",U,t[86]||(t[86]=[a(' ',1)]))),t[87]||(t[87]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("msub",null,[s("mi",null,"x"),s("mi",null,"n")]),s("mo",null,"="),s("mi",null,"a"),s("mo",null,"+"),s("mo",{stretchy:"false"},"("),s("mi",null,"b"),s("mo",null,"−"),s("mi",null,"a"),s("mo",{stretchy:"false"},")"),s("mfrac",null,[s("mrow",null,[s("mn",null,"1"),s("mo",null,"−"),s("msup",null,[s("mi",null,"s"),s("mi",null,"n")])]),s("mrow",null,[s("mn",null,"1"),s("mo",null,"−"),s("msup",null,[s("mi",null,"s"),s("mi",null,"N")])])]),s("mo",null,","),s("mstyle",{scriptlevel:"0"},[s("mspace",{width:"1em"})]),s("mi",null,"n"),s("mo",null,"="),s("mn",null,"0"),s("mo",null,","),s("mo",null,"…"),s("mo",null,","),s("mi",null,"N"),s("mo",null,".")])],-1))]),s("p",null,[t[90]||(t[90]=e("Note that ")),t[91]||(t[91]=s("code",null,"stretched_grid(a, b, N, s)[n]",-1)),t[92]||(t[92]=e(" corresponds to ")),s("mjx-container",X,[(o(),n("svg",K,t[88]||(t[88]=[a(' ',1)]))),t[89]||(t[89]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("msub",null,[s("mi",null,"x"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"n"),s("mo",null,"−"),s("mn",null,"1")])])])],-1))]),t[93]||(t[93]=e("."))]),t[95]||(t[95]=s("p",null,[e("See also "),s("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/manual/setup#IncompressibleNavierStokes.cosine_grid-Tuple{Any, Any, Any}"},[s("code",null,"cosine_grid")]),e(".")],-1)),t[96]||(t[96]=s("p",null,[s("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/grid.jl#L45",target:"_blank",rel:"noreferrer"},"source")],-1))]),s("details",$,[s("summary",null,[t[97]||(t[97]=s("a",{id:"IncompressibleNavierStokes.tanh_grid",href:"#IncompressibleNavierStokes.tanh_grid"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.tanh_grid")],-1)),t[98]||(t[98]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[99]||(t[99]=a(`julia tanh_grid (a, b, N) -> Any
+tanh_grid (a, b, N, γ) -> Any
Create a nonuniform grid of N + 1
points from a
to b
, as proposed by Trias et al. [10 ].
source
`,3))]),t[128]||(t[128]=s("h2",{id:"setup",tabindex:"-1"},[e("Setup "),s("a",{class:"header-anchor",href:"#setup","aria-label":'Permalink to "Setup"'},"")],-1)),s("details",W,[s("summary",null,[t[100]||(t[100]=s("a",{id:"KernelAbstractions.CPU",href:"#KernelAbstractions.CPU"},[s("span",{class:"jlbinding"},"KernelAbstractions.CPU")],-1)),t[101]||(t[101]=e()),l(i,{type:"info",class:"jlObjectType jlType",text:"Type"})]),t[102]||(t[102]=a('julia struct CPU <: KernelAbstractions.Backend
Instantiate a CPU (multi-threaded) backend.
Options:
static
: Uses a static thread assignment, this can be beneficial for NUMA aware code. Defaults to false.Fields
source
',8))]),s("details",Y,[s("summary",null,[t[103]||(t[103]=s("a",{id:"IncompressibleNavierStokes.Setup-Tuple{}",href:"#IncompressibleNavierStokes.Setup-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.Setup")],-1)),t[104]||(t[104]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[105]||(t[105]=a(`julia Setup (
+;
+ x,
+ boundary_conditions,
+ bodyforce,
+ dbodyforce,
+ issteadybodyforce,
+ closure_model,
+ backend,
+ workgroupsize,
+ temperature,
+ Re
+)
Create problem setup (stored in a named tuple).
source
`,3))]),s("details",_,[s("summary",null,[t[106]||(t[106]=s("a",{id:"IncompressibleNavierStokes.temperature_equation-Tuple{}",href:"#IncompressibleNavierStokes.temperature_equation-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.temperature_equation")],-1)),t[107]||(t[107]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[108]||(t[108]=a(`julia temperature_equation (
+;
+ Pr,
+ Ra,
+ Ge,
+ dodissipation,
+ boundary_conditions,
+ gdir,
+ nondim_type
+)
Create temperature equation setup (stored in a named tuple).
The equation is parameterized by three dimensionless numbers (Prandtl number, Rayleigh number, and Gebhart number), and requires separate boundary conditions for the temperature
field. The gdir
keyword specifies the direction gravity, while non_dim_type
specifies the type of non-dimensionalization.
source
`,4))]),t[129]||(t[129]=s("h2",{id:"Field-initializers",tabindex:"-1"},[e("Field initializers "),s("a",{class:"header-anchor",href:"#Field-initializers","aria-label":'Permalink to "Field initializers {#Field-initializers}"'},"")],-1)),s("details",s1,[s("summary",null,[t[109]||(t[109]=s("a",{id:"IncompressibleNavierStokes.random_field",href:"#IncompressibleNavierStokes.random_field"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.random_field")],-1)),t[110]||(t[110]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[111]||(t[111]=a(`julia random_field (setup; ... ) -> Any
+random_field (setup, t; A, kp, psolver, rng) -> Any
Create random field, as in [11 ].
source
`,4))]),s("details",t1,[s("summary",null,[t[112]||(t[112]=s("a",{id:"IncompressibleNavierStokes.scalarfield-Tuple{Any}",href:"#IncompressibleNavierStokes.scalarfield-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.scalarfield")],-1)),t[113]||(t[113]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[114]||(t[114]=a('julia scalarfield (setup) -> Any
Create empty scalar field.
source
',3))]),s("details",e1,[s("summary",null,[t[115]||(t[115]=s("a",{id:"IncompressibleNavierStokes.temperaturefield",href:"#IncompressibleNavierStokes.temperaturefield"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.temperaturefield")],-1)),t[116]||(t[116]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[117]||(t[117]=a(`julia temperaturefield (setup, tempfunc) -> Any
+temperaturefield (setup, tempfunc, t) -> Any
Create temperature field from function with boundary conditions at time t
.
source
`,3))]),s("details",a1,[s("summary",null,[t[118]||(t[118]=s("a",{id:"IncompressibleNavierStokes.vectorfield-Tuple{Any}",href:"#IncompressibleNavierStokes.vectorfield-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.vectorfield")],-1)),t[119]||(t[119]=e()),l(i,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),t[120]||(t[120]=a('julia vectorfield (setup) -> Any
Create empty vector field.
source
',3))]),s("details",i1,[s("summary",null,[t[121]||(t[121]=s("a",{id:"IncompressibleNavierStokes.velocityfield",href:"#IncompressibleNavierStokes.velocityfield"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.velocityfield")],-1)),t[122]||(t[122]=e()),l(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),t[123]||(t[123]=a(`julia velocityfield (setup, ufunc; ... ) -> Any
+velocityfield (setup, ufunc, t; psolver, doproject) -> Any
Create divergence free velocity field u
with boundary conditions at time t
. The initial conditions of u[α]
are specified by the function ufunc(α, x...)
.
source
`,3))])])}const m1=r(p,[["render",l1]]);export{T1 as __pageData,m1 as default};
diff --git a/previews/PR126/assets/manual_solver.md.DxVH47Jn.js b/previews/PR126/assets/manual_solver.md.DxVH47Jn.js
new file mode 100644
index 00000000..3346e971
--- /dev/null
+++ b/previews/PR126/assets/manual_solver.md.DxVH47Jn.js
@@ -0,0 +1,51 @@
+import{_ as p,c as n,j as s,a as t,G as l,a5 as i,B as r,o}from"./chunks/framework.BSoZtefh.js";const V=JSON.parse('{"title":"Solvers","description":"","frontmatter":{},"headers":[],"relativePath":"manual/solver.md","filePath":"manual/solver.md","lastUpdated":null}'),d={name:"manual/solver.md"},h={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},Q={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.703ex",height:"1.636ex",role:"img",focusable:"false",viewBox:"0 -683 2520.6 723","aria-hidden":"true"},b={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.428ex"},xmlns:"http://www.w3.org/2000/svg",width:"26.783ex",height:"5.507ex",role:"img",focusable:"false",viewBox:"0 -1361 11837.9 2434.1","aria-hidden":"true"},E={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""};function N(I,e,H,M,B,A){const a=r("Badge");return o(),n("div",null,[e[55]||(e[55]=s("h1",{id:"solvers",tabindex:"-1"},[t("Solvers "),s("a",{class:"header-anchor",href:"#solvers","aria-label":'Permalink to "Solvers"'},"")],-1)),e[56]||(e[56]=s("h2",{id:"Solvers-2",tabindex:"-1"},[t("Solvers "),s("a",{class:"header-anchor",href:"#Solvers-2","aria-label":'Permalink to "Solvers {#Solvers-2}"'},"")],-1)),s("details",h,[s("summary",null,[e[0]||(e[0]=s("a",{id:"IncompressibleNavierStokes.get_cfl_timestep!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.get_cfl_timestep!-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.get_cfl_timestep!")],-1)),e[1]||(e[1]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[2]||(e[2]=i('julia get_cfl_timestep! (buf, u, setup) -> Any
Get proposed maximum time step for convection and diffusion terms.
source
',3))]),s("details",k,[s("summary",null,[e[3]||(e[3]=s("a",{id:"IncompressibleNavierStokes.get_state-Tuple{Any}",href:"#IncompressibleNavierStokes.get_state-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.get_state")],-1)),e[4]||(e[4]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[5]||(e[5]=i(`julia get_state (
+ stepper
+) -> NamedTuple{( :u , :temp , :t , :n ), <: NTuple{4, Any} }
Get state (; u, temp, t, n)
from stepper.
source
`,3))]),s("details",c,[s("summary",null,[e[6]||(e[6]=s("a",{id:"IncompressibleNavierStokes.solve_unsteady-Tuple{}",href:"#IncompressibleNavierStokes.solve_unsteady-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.solve_unsteady")],-1)),e[7]||(e[7]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[8]||(e[8]=i(`julia solve_unsteady (
+;
+ setup,
+ tlims,
+ ustart,
+ tempstart,
+ method,
+ psolver,
+ Δt,
+ Δt_min,
+ cfl,
+ n_adapt_Δt,
+ docopy,
+ processors,
+ θ,
+ cache
+)
Solve unsteady problem using method
.
If Δt
is a real number, it is rounded such that (t_end - t_start) / Δt
is an integer. If Δt = nothing
, the time step is chosen every n_adapt_Δt
iteration with CFL-number cfl
. If Δt_min
is given, the adaptive time step never goes below it.
The processors
are called after every time step.
Note that the state
observable passed to the processor.initialize
function contains vector living on the device, and you may have to move them back to the host using Array(u)
in the processor.
Return (; u, t), outputs
, where outputs
is a named tuple with the outputs of processors
with the same field names.
source
`,7))]),e[57]||(e[57]=s("h2",{id:"processors",tabindex:"-1"},[t("Processors "),s("a",{class:"header-anchor",href:"#processors","aria-label":'Permalink to "Processors"'},"")],-1)),e[58]||(e[58]=s("p",null,[t("Processors can be used to process the solution in "),s("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/manual/solver#IncompressibleNavierStokes.solve_unsteady-Tuple{}"},[s("code",null,"solve_unsteady")]),t(" after every time step.")],-1)),s("details",m,[s("summary",null,[e[9]||(e[9]=s("a",{id:"IncompressibleNavierStokes.animator",href:"#IncompressibleNavierStokes.animator"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.animator")],-1)),e[10]||(e[10]=t()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[11]||(e[11]=i('Animate a plot of the solution every update
iteration. The animation is saved to path
, which should have one of the following extensions:
".mkv"
".mp4"
".webm"
".gif"
The plot is determined by a plotter
processor. Additional kwargs
are passed to plot
.
source
',4))]),s("details",g,[s("summary",null,[e[12]||(e[12]=s("a",{id:"IncompressibleNavierStokes.energy_history_plot",href:"#IncompressibleNavierStokes.energy_history_plot"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.energy_history_plot")],-1)),e[13]||(e[13]=t()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[14]||(e[14]=s("p",null,"Create energy history plot.",-1)),e[15]||(e[15]=s("p",null,[s("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/processors.jl#L392",target:"_blank",rel:"noreferrer"},"source")],-1))]),s("details",T,[s("summary",null,[e[16]||(e[16]=s("a",{id:"IncompressibleNavierStokes.energy_spectrum_plot",href:"#IncompressibleNavierStokes.energy_spectrum_plot"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.energy_spectrum_plot")],-1)),e[17]||(e[17]=t()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s("p",null,[e[20]||(e[20]=t("Create energy spectrum plot. The energy at a scalar wavenumber level ")),s("mjx-container",Q,[(o(),n("svg",u,e[18]||(e[18]=[i(' ',1)]))),e[19]||(e[19]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"κ"),s("mo",null,"∈"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"double-struck"},"N")])])],-1))]),e[21]||(e[21]=t(" is defined by"))]),s("mjx-container",b,[(o(),n("svg",y,e[22]||(e[22]=[i(' ',1)]))),e[23]||(e[23]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mrow",{"data-mjx-texclass":"ORD"},[s("mover",null,[s("mi",null,"e"),s("mo",{stretchy:"false"},"^")])]),s("mo",{stretchy:"false"},"("),s("mi",null,"κ"),s("mo",{stretchy:"false"},")"),s("mo",null,"="),s("msub",null,[s("mo",{"data-mjx-texclass":"OP"},"∫"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"κ"),s("mo",null,"≤"),s("mo",{"data-mjx-texclass":"ORD"},"∥"),s("mi",null,"k"),s("msub",null,[s("mo",{"data-mjx-texclass":"ORD"},"∥"),s("mn",null,"2")]),s("mo",null,"<"),s("mi",null,"κ"),s("mo",null,"+"),s("mn",null,"1")])]),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mover",null,[s("mi",null,"e"),s("mo",{stretchy:"false"},"^")])]),s("mo",{stretchy:"false"},"("),s("mi",null,"k"),s("mo",{stretchy:"false"},")"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"d")]),s("mi",null,"k"),s("mo",null,",")])],-1))]),e[24]||(e[24]=i('as in San and Staples [12 ].
Keyword arguments:
sloperange = [0.6, 0.9]
: Percentage (between 0 and 1) of x-axis where the slope is plotted.
slopeoffset = 1.3
: How far above the energy spectrum the inertial slope is plotted.
kwargs...
: They are passed to observespectrum
.
source
',4))]),s("details",E,[s("summary",null,[e[25]||(e[25]=s("a",{id:"IncompressibleNavierStokes.fieldplot",href:"#IncompressibleNavierStokes.fieldplot"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.fieldplot")],-1)),e[26]||(e[26]=t()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[27]||(e[27]=i('Plot state
field in pressure points. If state
is Observable
, then the plot is interactive.
Available fieldnames are:
:velocity
,
:vorticity
,
:streamfunction
,
:pressure
.
Available plot type
s for 2D are:
heatmap
(default),
image
,
contour
,
contourf
.
Available plot type
s for 3D are:
The alpha
value gets passed to contour
in 3D.
source
',9))]),s("details",v,[s("summary",null,[e[28]||(e[28]=s("a",{id:"IncompressibleNavierStokes.fieldsaver-Tuple{}",href:"#IncompressibleNavierStokes.fieldsaver-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.fieldsaver")],-1)),e[29]||(e[29]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[30]||(e[30]=i('julia fieldsaver (; setup, nupdate)
Create processor that stores the solution and time every nupdate
time step.
source
',3))]),s("details",f,[s("summary",null,[e[31]||(e[31]=s("a",{id:"IncompressibleNavierStokes.observefield-Tuple{Any}",href:"#IncompressibleNavierStokes.observefield-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.observefield")],-1)),e[32]||(e[32]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[33]||(e[33]=i('julia observefield (state; setup, fieldname, logtol, psolver)
Observe field fieldname
at pressure points.
source
',3))]),s("details",j,[s("summary",null,[e[34]||(e[34]=s("a",{id:"IncompressibleNavierStokes.observespectrum-Tuple{Any}",href:"#IncompressibleNavierStokes.observespectrum-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.observespectrum")],-1)),e[35]||(e[35]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[36]||(e[36]=i('julia observespectrum (state; setup, npoint, a)
Observe energy spectrum of state
.
source
',3))]),s("details",F,[s("summary",null,[e[37]||(e[37]=s("a",{id:"IncompressibleNavierStokes.processor",href:"#IncompressibleNavierStokes.processor"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.processor")],-1)),e[38]||(e[38]=t()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[39]||(e[39]=i(`julia processor (
+ initialize
+) -> NamedTuple{( :initialize , :finalize ), <: Tuple{Any, IncompressibleNavierStokes.var"#295#296"} }
+processor (
+ initialize,
+ finalize
+) -> NamedTuple{( :initialize , :finalize ), <: Tuple{Any, Any} }
Process results from time stepping. Before time stepping, the initialize
function is called on an observable of the time stepper state
, returning initialized
. The observable is updated every time step.
After timestepping, the finalize
function is called on initialized
and the final state
.
See the following example:
julia function initialize (state)
+ s = 0
+ println ( "Let's sum up the time steps" )
+ on (state) do (; n, t)
+ println ( "The summand is $n , the time is $t " )
+ s = s + n
+ end
+ s
+end
+
+finalize (i, state) = println ( "The final sum (at time t= $(state . t) ) is $s " )
+p = processor (initialize, finalize)
When solved for 6 time steps from t=0 to t=2 the displayed output is
Let's sum up the time steps
+The summand is 0, the time is 0.0
+The summand is 1, the time is 0.4
+The summand is 2, the time is 0.8
+The summand is 3, the time is 1.2
+The summand is 4, the time is 1.6
+The summand is 5, the time is 2.0
+The final sum (at time t=2.0) is 15
source
`,8))]),s("details",C,[s("summary",null,[e[40]||(e[40]=s("a",{id:"IncompressibleNavierStokes.realtimeplotter",href:"#IncompressibleNavierStokes.realtimeplotter"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.realtimeplotter")],-1)),e[41]||(e[41]=t()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[42]||(e[42]=i('Processor for plotting the solution in real time.
Keyword arguments:
plot
: Plot function.
nupdate
: Show solution every nupdate
time step.
displayfig
: Display the figure at the start.
screen
: If nothing
, use default display. If GLMakie.screen()
multiple plots can be displayed in separate windows like in MATLAB (see also GLMakie.closeall()
).
displayupdates
: Display the figure at every update (if using CairoMakie).
sleeptime
: The sleeptime
is slept at every update, to give Makie time to update the plot. Set this to nothing
to skip sleeping.
Additional kwargs
are passed to the plot
function.
source
',5))]),s("details",x,[s("summary",null,[e[43]||(e[43]=s("a",{id:"IncompressibleNavierStokes.save_vtk-Tuple{Any}",href:"#IncompressibleNavierStokes.save_vtk-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.save_vtk")],-1)),e[44]||(e[44]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[45]||(e[45]=i('julia save_vtk (state; setup, filename, kwargs ... )
Save fields to vtk file.
The kwargs
are passed to snapshotsaver
.
source
',4))]),s("details",w,[s("summary",null,[e[46]||(e[46]=s("a",{id:"IncompressibleNavierStokes.snapshotsaver-Tuple{Any}",href:"#IncompressibleNavierStokes.snapshotsaver-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.snapshotsaver")],-1)),e[47]||(e[47]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[48]||(e[48]=i('julia snapshotsaver (state; setup, fieldnames, psolver)
In the case of a 2D setup, the velocity field is saved as a 3D vector with a z-component of zero, as this seems to be preferred by ParaView.
source
',3))]),s("details",L,[s("summary",null,[e[49]||(e[49]=s("a",{id:"IncompressibleNavierStokes.timelogger-Tuple{}",href:"#IncompressibleNavierStokes.timelogger-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.timelogger")],-1)),e[50]||(e[50]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[51]||(e[51]=i(`julia timelogger (
+;
+ showiter,
+ showt,
+ showdt,
+ showmax,
+ showspeed,
+ nupdate
+) -> @NamedTuple {initialize :: IncompressibleNavierStokes.var"#298#300" {Bool, Bool, Bool, Bool, Bool, Int64}, finalize :: IncompressibleNavierStokes.var"#295#296" }
Create processor that logs time step information.
source
`,3))]),s("details",S,[s("summary",null,[e[52]||(e[52]=s("a",{id:"IncompressibleNavierStokes.vtk_writer-Tuple{}",href:"#IncompressibleNavierStokes.vtk_writer-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.vtk_writer")],-1)),e[53]||(e[53]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[54]||(e[54]=i('julia vtk_writer (; setup, nupdate, dir, filename, kwargs ... )
Create processor that writes the solution every nupdate
time steps to a VTK file. The resulting Paraview data collection file is stored in "$dir/$filename.pvd"
. The kwargs
are passed to snapshotsaver
.
source
',3))])])}const Z=p(d,[["render",N]]);export{V as __pageData,Z as default};
diff --git a/previews/PR126/assets/manual_solver.md.DxVH47Jn.lean.js b/previews/PR126/assets/manual_solver.md.DxVH47Jn.lean.js
new file mode 100644
index 00000000..3346e971
--- /dev/null
+++ b/previews/PR126/assets/manual_solver.md.DxVH47Jn.lean.js
@@ -0,0 +1,51 @@
+import{_ as p,c as n,j as s,a as t,G as l,a5 as i,B as r,o}from"./chunks/framework.BSoZtefh.js";const V=JSON.parse('{"title":"Solvers","description":"","frontmatter":{},"headers":[],"relativePath":"manual/solver.md","filePath":"manual/solver.md","lastUpdated":null}'),d={name:"manual/solver.md"},h={class:"jldocstring custom-block",open:""},k={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},g={class:"jldocstring custom-block",open:""},T={class:"jldocstring custom-block",open:""},Q={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.703ex",height:"1.636ex",role:"img",focusable:"false",viewBox:"0 -683 2520.6 723","aria-hidden":"true"},b={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.428ex"},xmlns:"http://www.w3.org/2000/svg",width:"26.783ex",height:"5.507ex",role:"img",focusable:"false",viewBox:"0 -1361 11837.9 2434.1","aria-hidden":"true"},E={class:"jldocstring custom-block",open:""},v={class:"jldocstring custom-block",open:""},f={class:"jldocstring custom-block",open:""},j={class:"jldocstring custom-block",open:""},F={class:"jldocstring custom-block",open:""},C={class:"jldocstring custom-block",open:""},x={class:"jldocstring custom-block",open:""},w={class:"jldocstring custom-block",open:""},L={class:"jldocstring custom-block",open:""},S={class:"jldocstring custom-block",open:""};function N(I,e,H,M,B,A){const a=r("Badge");return o(),n("div",null,[e[55]||(e[55]=s("h1",{id:"solvers",tabindex:"-1"},[t("Solvers "),s("a",{class:"header-anchor",href:"#solvers","aria-label":'Permalink to "Solvers"'},"")],-1)),e[56]||(e[56]=s("h2",{id:"Solvers-2",tabindex:"-1"},[t("Solvers "),s("a",{class:"header-anchor",href:"#Solvers-2","aria-label":'Permalink to "Solvers {#Solvers-2}"'},"")],-1)),s("details",h,[s("summary",null,[e[0]||(e[0]=s("a",{id:"IncompressibleNavierStokes.get_cfl_timestep!-Tuple{Any, Any, Any}",href:"#IncompressibleNavierStokes.get_cfl_timestep!-Tuple{Any, Any, Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.get_cfl_timestep!")],-1)),e[1]||(e[1]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[2]||(e[2]=i('julia get_cfl_timestep! (buf, u, setup) -> Any
Get proposed maximum time step for convection and diffusion terms.
source
',3))]),s("details",k,[s("summary",null,[e[3]||(e[3]=s("a",{id:"IncompressibleNavierStokes.get_state-Tuple{Any}",href:"#IncompressibleNavierStokes.get_state-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.get_state")],-1)),e[4]||(e[4]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[5]||(e[5]=i(`julia get_state (
+ stepper
+) -> NamedTuple{( :u , :temp , :t , :n ), <: NTuple{4, Any} }
Get state (; u, temp, t, n)
from stepper.
source
`,3))]),s("details",c,[s("summary",null,[e[6]||(e[6]=s("a",{id:"IncompressibleNavierStokes.solve_unsteady-Tuple{}",href:"#IncompressibleNavierStokes.solve_unsteady-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.solve_unsteady")],-1)),e[7]||(e[7]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[8]||(e[8]=i(`julia solve_unsteady (
+;
+ setup,
+ tlims,
+ ustart,
+ tempstart,
+ method,
+ psolver,
+ Δt,
+ Δt_min,
+ cfl,
+ n_adapt_Δt,
+ docopy,
+ processors,
+ θ,
+ cache
+)
Solve unsteady problem using method
.
If Δt
is a real number, it is rounded such that (t_end - t_start) / Δt
is an integer. If Δt = nothing
, the time step is chosen every n_adapt_Δt
iteration with CFL-number cfl
. If Δt_min
is given, the adaptive time step never goes below it.
The processors
are called after every time step.
Note that the state
observable passed to the processor.initialize
function contains vector living on the device, and you may have to move them back to the host using Array(u)
in the processor.
Return (; u, t), outputs
, where outputs
is a named tuple with the outputs of processors
with the same field names.
source
`,7))]),e[57]||(e[57]=s("h2",{id:"processors",tabindex:"-1"},[t("Processors "),s("a",{class:"header-anchor",href:"#processors","aria-label":'Permalink to "Processors"'},"")],-1)),e[58]||(e[58]=s("p",null,[t("Processors can be used to process the solution in "),s("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/manual/solver#IncompressibleNavierStokes.solve_unsteady-Tuple{}"},[s("code",null,"solve_unsteady")]),t(" after every time step.")],-1)),s("details",m,[s("summary",null,[e[9]||(e[9]=s("a",{id:"IncompressibleNavierStokes.animator",href:"#IncompressibleNavierStokes.animator"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.animator")],-1)),e[10]||(e[10]=t()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[11]||(e[11]=i('Animate a plot of the solution every update
iteration. The animation is saved to path
, which should have one of the following extensions:
".mkv"
".mp4"
".webm"
".gif"
The plot is determined by a plotter
processor. Additional kwargs
are passed to plot
.
source
',4))]),s("details",g,[s("summary",null,[e[12]||(e[12]=s("a",{id:"IncompressibleNavierStokes.energy_history_plot",href:"#IncompressibleNavierStokes.energy_history_plot"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.energy_history_plot")],-1)),e[13]||(e[13]=t()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[14]||(e[14]=s("p",null,"Create energy history plot.",-1)),e[15]||(e[15]=s("p",null,[s("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/processors.jl#L392",target:"_blank",rel:"noreferrer"},"source")],-1))]),s("details",T,[s("summary",null,[e[16]||(e[16]=s("a",{id:"IncompressibleNavierStokes.energy_spectrum_plot",href:"#IncompressibleNavierStokes.energy_spectrum_plot"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.energy_spectrum_plot")],-1)),e[17]||(e[17]=t()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s("p",null,[e[20]||(e[20]=t("Create energy spectrum plot. The energy at a scalar wavenumber level ")),s("mjx-container",Q,[(o(),n("svg",u,e[18]||(e[18]=[i(' ',1)]))),e[19]||(e[19]=s("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[s("mi",null,"κ"),s("mo",null,"∈"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"double-struck"},"N")])])],-1))]),e[21]||(e[21]=t(" is defined by"))]),s("mjx-container",b,[(o(),n("svg",y,e[22]||(e[22]=[i(' ',1)]))),e[23]||(e[23]=s("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[s("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[s("mrow",{"data-mjx-texclass":"ORD"},[s("mover",null,[s("mi",null,"e"),s("mo",{stretchy:"false"},"^")])]),s("mo",{stretchy:"false"},"("),s("mi",null,"κ"),s("mo",{stretchy:"false"},")"),s("mo",null,"="),s("msub",null,[s("mo",{"data-mjx-texclass":"OP"},"∫"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",null,"κ"),s("mo",null,"≤"),s("mo",{"data-mjx-texclass":"ORD"},"∥"),s("mi",null,"k"),s("msub",null,[s("mo",{"data-mjx-texclass":"ORD"},"∥"),s("mn",null,"2")]),s("mo",null,"<"),s("mi",null,"κ"),s("mo",null,"+"),s("mn",null,"1")])]),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mover",null,[s("mi",null,"e"),s("mo",{stretchy:"false"},"^")])]),s("mo",{stretchy:"false"},"("),s("mi",null,"k"),s("mo",{stretchy:"false"},")"),s("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),s("mrow",{"data-mjx-texclass":"ORD"},[s("mi",{mathvariant:"normal"},"d")]),s("mi",null,"k"),s("mo",null,",")])],-1))]),e[24]||(e[24]=i('as in San and Staples [12 ].
Keyword arguments:
sloperange = [0.6, 0.9]
: Percentage (between 0 and 1) of x-axis where the slope is plotted.
slopeoffset = 1.3
: How far above the energy spectrum the inertial slope is plotted.
kwargs...
: They are passed to observespectrum
.
source
',4))]),s("details",E,[s("summary",null,[e[25]||(e[25]=s("a",{id:"IncompressibleNavierStokes.fieldplot",href:"#IncompressibleNavierStokes.fieldplot"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.fieldplot")],-1)),e[26]||(e[26]=t()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[27]||(e[27]=i('Plot state
field in pressure points. If state
is Observable
, then the plot is interactive.
Available fieldnames are:
:velocity
,
:vorticity
,
:streamfunction
,
:pressure
.
Available plot type
s for 2D are:
heatmap
(default),
image
,
contour
,
contourf
.
Available plot type
s for 3D are:
The alpha
value gets passed to contour
in 3D.
source
',9))]),s("details",v,[s("summary",null,[e[28]||(e[28]=s("a",{id:"IncompressibleNavierStokes.fieldsaver-Tuple{}",href:"#IncompressibleNavierStokes.fieldsaver-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.fieldsaver")],-1)),e[29]||(e[29]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[30]||(e[30]=i('julia fieldsaver (; setup, nupdate)
Create processor that stores the solution and time every nupdate
time step.
source
',3))]),s("details",f,[s("summary",null,[e[31]||(e[31]=s("a",{id:"IncompressibleNavierStokes.observefield-Tuple{Any}",href:"#IncompressibleNavierStokes.observefield-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.observefield")],-1)),e[32]||(e[32]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[33]||(e[33]=i('julia observefield (state; setup, fieldname, logtol, psolver)
Observe field fieldname
at pressure points.
source
',3))]),s("details",j,[s("summary",null,[e[34]||(e[34]=s("a",{id:"IncompressibleNavierStokes.observespectrum-Tuple{Any}",href:"#IncompressibleNavierStokes.observespectrum-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.observespectrum")],-1)),e[35]||(e[35]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[36]||(e[36]=i('julia observespectrum (state; setup, npoint, a)
Observe energy spectrum of state
.
source
',3))]),s("details",F,[s("summary",null,[e[37]||(e[37]=s("a",{id:"IncompressibleNavierStokes.processor",href:"#IncompressibleNavierStokes.processor"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.processor")],-1)),e[38]||(e[38]=t()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[39]||(e[39]=i(`julia processor (
+ initialize
+) -> NamedTuple{( :initialize , :finalize ), <: Tuple{Any, IncompressibleNavierStokes.var"#295#296"} }
+processor (
+ initialize,
+ finalize
+) -> NamedTuple{( :initialize , :finalize ), <: Tuple{Any, Any} }
Process results from time stepping. Before time stepping, the initialize
function is called on an observable of the time stepper state
, returning initialized
. The observable is updated every time step.
After timestepping, the finalize
function is called on initialized
and the final state
.
See the following example:
julia function initialize (state)
+ s = 0
+ println ( "Let's sum up the time steps" )
+ on (state) do (; n, t)
+ println ( "The summand is $n , the time is $t " )
+ s = s + n
+ end
+ s
+end
+
+finalize (i, state) = println ( "The final sum (at time t= $(state . t) ) is $s " )
+p = processor (initialize, finalize)
When solved for 6 time steps from t=0 to t=2 the displayed output is
Let's sum up the time steps
+The summand is 0, the time is 0.0
+The summand is 1, the time is 0.4
+The summand is 2, the time is 0.8
+The summand is 3, the time is 1.2
+The summand is 4, the time is 1.6
+The summand is 5, the time is 2.0
+The final sum (at time t=2.0) is 15
source
`,8))]),s("details",C,[s("summary",null,[e[40]||(e[40]=s("a",{id:"IncompressibleNavierStokes.realtimeplotter",href:"#IncompressibleNavierStokes.realtimeplotter"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.realtimeplotter")],-1)),e[41]||(e[41]=t()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[42]||(e[42]=i('Processor for plotting the solution in real time.
Keyword arguments:
plot
: Plot function.
nupdate
: Show solution every nupdate
time step.
displayfig
: Display the figure at the start.
screen
: If nothing
, use default display. If GLMakie.screen()
multiple plots can be displayed in separate windows like in MATLAB (see also GLMakie.closeall()
).
displayupdates
: Display the figure at every update (if using CairoMakie).
sleeptime
: The sleeptime
is slept at every update, to give Makie time to update the plot. Set this to nothing
to skip sleeping.
Additional kwargs
are passed to the plot
function.
source
',5))]),s("details",x,[s("summary",null,[e[43]||(e[43]=s("a",{id:"IncompressibleNavierStokes.save_vtk-Tuple{Any}",href:"#IncompressibleNavierStokes.save_vtk-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.save_vtk")],-1)),e[44]||(e[44]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[45]||(e[45]=i('julia save_vtk (state; setup, filename, kwargs ... )
Save fields to vtk file.
The kwargs
are passed to snapshotsaver
.
source
',4))]),s("details",w,[s("summary",null,[e[46]||(e[46]=s("a",{id:"IncompressibleNavierStokes.snapshotsaver-Tuple{Any}",href:"#IncompressibleNavierStokes.snapshotsaver-Tuple{Any}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.snapshotsaver")],-1)),e[47]||(e[47]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[48]||(e[48]=i('julia snapshotsaver (state; setup, fieldnames, psolver)
In the case of a 2D setup, the velocity field is saved as a 3D vector with a z-component of zero, as this seems to be preferred by ParaView.
source
',3))]),s("details",L,[s("summary",null,[e[49]||(e[49]=s("a",{id:"IncompressibleNavierStokes.timelogger-Tuple{}",href:"#IncompressibleNavierStokes.timelogger-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.timelogger")],-1)),e[50]||(e[50]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[51]||(e[51]=i(`julia timelogger (
+;
+ showiter,
+ showt,
+ showdt,
+ showmax,
+ showspeed,
+ nupdate
+) -> @NamedTuple {initialize :: IncompressibleNavierStokes.var"#298#300" {Bool, Bool, Bool, Bool, Bool, Int64}, finalize :: IncompressibleNavierStokes.var"#295#296" }
Create processor that logs time step information.
source
`,3))]),s("details",S,[s("summary",null,[e[52]||(e[52]=s("a",{id:"IncompressibleNavierStokes.vtk_writer-Tuple{}",href:"#IncompressibleNavierStokes.vtk_writer-Tuple{}"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.vtk_writer")],-1)),e[53]||(e[53]=t()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),e[54]||(e[54]=i('julia vtk_writer (; setup, nupdate, dir, filename, kwargs ... )
Create processor that writes the solution every nupdate
time steps to a VTK file. The resulting Paraview data collection file is stored in "$dir/$filename.pvd"
. The kwargs
are passed to snapshotsaver
.
source
',3))])])}const Z=p(d,[["render",N]]);export{V as __pageData,Z as default};
diff --git a/previews/PR126/assets/manual_spatial.md.Cj3WsAzX.js b/previews/PR126/assets/manual_spatial.md.Cj3WsAzX.js
new file mode 100644
index 00000000..924ddbd3
--- /dev/null
+++ b/previews/PR126/assets/manual_spatial.md.Cj3WsAzX.js
@@ -0,0 +1 @@
+import{_ as s,c as T,j as Q,a,a5 as l,o as e}from"./chunks/framework.BSoZtefh.js";const m="/IncompressibleNavierStokes.jl/previews/PR126/assets/grid.BpiJkA_F.png",q4=JSON.parse('{"title":"Spatial discretization","description":"","frontmatter":{},"headers":[],"relativePath":"manual/spatial.md","filePath":"manual/spatial.md","lastUpdated":null}'),o={name:"manual/spatial.md"},n={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.023ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.176ex",height:"1.593ex",role:"img",focusable:"false",viewBox:"0 -694 520 704","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},i={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"13.825ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6110.6 1000","aria-hidden":"true"},h={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.448ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 640 453","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},H={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.04ex"},xmlns:"http://www.w3.org/2000/svg",width:"13.352ex",height:"2.972ex",role:"img",focusable:"false",viewBox:"0 -853.7 5901.8 1313.5","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.65ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.171ex",height:"1.65ex",role:"img",focusable:"false",viewBox:"0 -442 1401.8 729.2","aria-hidden":"true"},w={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},L={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.746ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -705 2539.6 899","aria-hidden":"true"},y={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 500 688","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},V={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.06ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4446.7 1000","aria-hidden":"true"},Z={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.957ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6610.8 1000","aria-hidden":"true"},v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.023ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.176ex",height:"1.593ex",role:"img",focusable:"false",viewBox:"0 -694 520 704","aria-hidden":"true"},j={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.207ex",height:"1.902ex",role:"img",focusable:"false",viewBox:"0 -683 975.5 840.8","aria-hidden":"true"},O={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.781ex",height:"1.52ex",role:"img",focusable:"false",viewBox:"0 -661 345 672","aria-hidden":"true"},F={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.462ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.932ex",height:"1.957ex",role:"img",focusable:"false",viewBox:"0 -661 412 865","aria-hidden":"true"},B={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},S={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},z={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.288ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1011.4 592","aria-hidden":"true"},I={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},G={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.666ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.693ex",height:"1.666ex",role:"img",focusable:"false",viewBox:"0 -442 1190.3 736.2","aria-hidden":"true"},J={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.666ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.526ex",height:"1.666ex",role:"img",focusable:"false",viewBox:"0 -442 1558.7 736.2","aria-hidden":"true"},P={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.897ex",height:"2.966ex",role:"img",focusable:"false",viewBox:"0 -967.8 7468.5 1311.1","aria-hidden":"true"},N={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.608ex",height:"1.927ex",role:"img",focusable:"false",viewBox:"0 -694 3362.7 851.8","aria-hidden":"true"},K={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.136ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 944 1000","aria-hidden":"true"},$={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.708ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.628ex",height:"2.404ex",role:"img",focusable:"false",viewBox:"0 -749.5 5581.6 1062.6","aria-hidden":"true"},_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.633ex",height:"1.593ex",role:"img",focusable:"false",viewBox:"0 -704 722 704","aria-hidden":"true"},t1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},a1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.781ex"},xmlns:"http://www.w3.org/2000/svg",width:"33.248ex",height:"2.97ex",role:"img",focusable:"false",viewBox:"0 -967.8 14695.6 1312.8","aria-hidden":"true"},T1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"22.887ex",height:"2.497ex",role:"img",focusable:"false",viewBox:"0 -853.7 10116.1 1103.7","aria-hidden":"true"},l1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},s1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.949ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.047ex",height:"3.138ex",role:"img",focusable:"false",viewBox:"0 -967.8 6650.7 1387.1","aria-hidden":"true"},m1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.159ex"},xmlns:"http://www.w3.org/2000/svg",width:"31.899ex",height:"3.398ex",role:"img",focusable:"false",viewBox:"0 -989.3 14099.5 1501.7","aria-hidden":"true"},n1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.539ex"},xmlns:"http://www.w3.org/2000/svg",width:"18.351ex",height:"4.14ex",role:"img",focusable:"false",viewBox:"0 -1149.5 8111.2 1829.8","aria-hidden":"true"},r1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},i1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.949ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.17ex",height:"2.477ex",role:"img",focusable:"false",viewBox:"0 -675.5 4937 1094.8","aria-hidden":"true"},h1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.539ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.881ex",height:"4.14ex",role:"img",focusable:"false",viewBox:"0 -1149.5 9671.5 1829.8","aria-hidden":"true"},g1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},H1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"23.431ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 10356.5 1000","aria-hidden":"true"},u1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.216ex",height:"1.979ex",role:"img",focusable:"false",viewBox:"0 -717 979.5 874.8","aria-hidden":"true"},w1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.725ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4298.3 1000","aria-hidden":"true"},L1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},f1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.558ex"},xmlns:"http://www.w3.org/2000/svg",width:"24.85ex",height:"5.509ex",role:"img",focusable:"false",viewBox:"0 -1304.6 10983.9 2435","aria-hidden":"true"},y1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.817ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.673ex",height:"2.852ex",role:"img",focusable:"false",viewBox:"0 -899.6 1623.4 1260.7","aria-hidden":"true"},k1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},V1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.359ex",height:"1.636ex",role:"img",focusable:"false",viewBox:"0 -683 2368.6 723","aria-hidden":"true"},Z1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.639ex",height:"1.927ex",role:"img",focusable:"false",viewBox:"0 -694 4702.5 851.8","aria-hidden":"true"},v1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.662ex",height:"2.966ex",role:"img",focusable:"false",viewBox:"0 -967.8 7364.4 1311.1","aria-hidden":"true"},j1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.628ex",height:"1.932ex",role:"img",focusable:"false",viewBox:"0 -704 1161.4 854","aria-hidden":"true"},O1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.359ex",height:"1.636ex",role:"img",focusable:"false",viewBox:"0 -683 2368.6 723","aria-hidden":"true"},F1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.709ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2081.4 1000","aria-hidden":"true"},B1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.448ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 640 453","aria-hidden":"true"},S1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},z1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.696ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.626ex",height:"2.235ex",role:"img",focusable:"false",viewBox:"0 -680 1160.5 987.7","aria-hidden":"true"},I1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},G1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.639ex",height:"1.927ex",role:"img",focusable:"false",viewBox:"0 -694 4702.5 851.8","aria-hidden":"true"},J1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.696ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.083ex",height:"2.393ex",role:"img",focusable:"false",viewBox:"0 -750 2246.5 1057.7","aria-hidden":"true"},P1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.138ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 503 636","aria-hidden":"true"},N1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.023ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.176ex",height:"1.593ex",role:"img",focusable:"false",viewBox:"0 -694 520 704","aria-hidden":"true"},K1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.506ex",height:"1.553ex",role:"img",focusable:"false",viewBox:"0 -675.5 1107.5 686.5","aria-hidden":"true"},$1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Y1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.288ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1011.4 592","aria-hidden":"true"},_1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.592ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.311ex",height:"1.592ex",role:"img",focusable:"false",viewBox:"0 -442 2347.5 703.6","aria-hidden":"true"},t3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},a3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.359ex",height:"1.636ex",role:"img",focusable:"false",viewBox:"0 -683 2368.6 723","aria-hidden":"true"},T3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.446ex",height:"1.934ex",role:"img",focusable:"false",viewBox:"0 -705 3290.9 855","aria-hidden":"true"},l3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},s3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.359ex",height:"1.636ex",role:"img",focusable:"false",viewBox:"0 -683 2368.6 723","aria-hidden":"true"},m3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.011ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.651ex",height:"2.834ex",role:"img",focusable:"false",viewBox:"0 -805.5 7359.6 1252.4","aria-hidden":"true"},n3={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},d3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.819ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.52ex",height:"6.757ex",role:"img",focusable:"false",viewBox:"0 -1740.7 6860 2986.6","aria-hidden":"true"},r3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},i3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.949ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.677ex",height:"2.644ex",role:"img",focusable:"false",viewBox:"0 -749.5 6929.3 1168.8","aria-hidden":"true"},h3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.448ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 640 453","aria-hidden":"true"},g3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},H3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.446ex",height:"1.934ex",role:"img",focusable:"false",viewBox:"0 -705 3290.9 855","aria-hidden":"true"},u3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.639ex",height:"1.927ex",role:"img",focusable:"false",viewBox:"0 -694 4702.5 851.8","aria-hidden":"true"},w3={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},x3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.06ex"},xmlns:"http://www.w3.org/2000/svg",width:"61.46ex",height:"6.999ex",role:"img",focusable:"false",viewBox:"0 -1740.7 27165.4 3093.4","aria-hidden":"true"},L3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.244ex",height:"2.059ex",role:"img",focusable:"false",viewBox:"0 -705 550 910","aria-hidden":"true"},y3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.65ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.456ex",height:"2.347ex",role:"img",focusable:"false",viewBox:"0 -750 4179.4 1037.2","aria-hidden":"true"},k3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},V3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.14ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 504 683","aria-hidden":"true"},Z3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.799ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.297ex",height:"2.496ex",role:"img",focusable:"false",viewBox:"0 -750 4551.3 1103.1","aria-hidden":"true"},v3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.799ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.297ex",height:"2.496ex",role:"img",focusable:"false",viewBox:"0 -750 4551.3 1103.1","aria-hidden":"true"},j3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.173ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.027ex",height:"2.702ex",role:"img",focusable:"false",viewBox:"0 -675.5 2664 1194.1","aria-hidden":"true"},O3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.696ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.506ex",height:"2.225ex",role:"img",focusable:"false",viewBox:"0 -675.5 1107.5 983.3","aria-hidden":"true"},F3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.173ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.027ex",height:"2.702ex",role:"img",focusable:"false",viewBox:"0 -675.5 2664 1194.1","aria-hidden":"true"},B3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.893ex",height:"1.974ex",role:"img",focusable:"false",viewBox:"0 -861.5 2162.8 872.5","aria-hidden":"true"},S3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},z3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.65ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.302ex",height:"2.22ex",role:"img",focusable:"false",viewBox:"0 -694 2785.7 981.2","aria-hidden":"true"},I3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},G3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.65ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.302ex",height:"2.22ex",role:"img",focusable:"false",viewBox:"0 -694 2785.7 981.2","aria-hidden":"true"},J3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.394ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 1500 1000","aria-hidden":"true"},P3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.448ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 640 453","aria-hidden":"true"},N3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.281ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -705 566 899","aria-hidden":"true"},K3={class:"tip custom-block"},U3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},$3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.912ex",role:"img",focusable:"false",viewBox:"0 -833.9 1008.6 844.9","aria-hidden":"true"},Y3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},_3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.781ex",height:"1.52ex",role:"img",focusable:"false",viewBox:"0 -661 345 672","aria-hidden":"true"},Q2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},t2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.912ex",role:"img",focusable:"false",viewBox:"0 -833.9 1008.6 844.9","aria-hidden":"true"},a2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.462ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.932ex",height:"1.957ex",role:"img",focusable:"false",viewBox:"0 -661 412 865","aria-hidden":"true"},e2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.91ex",role:"img",focusable:"false",viewBox:"0 -833.2 1008.6 844.2","aria-hidden":"true"},s2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},o2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},n2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.448ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 640 453","aria-hidden":"true"},d2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.333ex"},xmlns:"http://www.w3.org/2000/svg",width:"42.174ex",height:"3.232ex",role:"img",focusable:"false",viewBox:"0 -839.4 18641 1428.6","aria-hidden":"true"},i2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},h2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.818ex"},xmlns:"http://www.w3.org/2000/svg",width:"28.325ex",height:"6.755ex",role:"img",focusable:"false",viewBox:"0 -1740.2 12519.5 2985.6","aria-hidden":"true"},p2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.97ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.65ex",height:"2.869ex",role:"img",focusable:"false",viewBox:"0 -839.4 2497.5 1268.1","aria-hidden":"true"},H2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},u2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.819ex"},xmlns:"http://www.w3.org/2000/svg",width:"37.854ex",height:"6.757ex",role:"img",focusable:"false",viewBox:"0 -1740.7 16731.4 2986.6","aria-hidden":"true"},c2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},w2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.06ex"},xmlns:"http://www.w3.org/2000/svg",width:"76.065ex",height:"6.999ex",role:"img",focusable:"false",viewBox:"0 -1740.7 33620.8 3093.4","aria-hidden":"true"},x2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},L2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.504ex"},xmlns:"http://www.w3.org/2000/svg",width:"31.611ex",height:"5.456ex",role:"img",focusable:"false",viewBox:"0 -1304.6 13972.2 2411.5","aria-hidden":"true"},f2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},y2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.302ex",height:"2.009ex",role:"img",focusable:"false",viewBox:"0 -683 6763.5 888","aria-hidden":"true"},M2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"2.378ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 1051 683","aria-hidden":"true"},V2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Z2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.978ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 1316.2 647","aria-hidden":"true"},b2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},v2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.243ex"},xmlns:"http://www.w3.org/2000/svg",width:"49.56ex",height:"7.618ex",role:"img",focusable:"false",viewBox:"0 -1933.5 21905.5 3367","aria-hidden":"true"},D2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.719ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 760 727","aria-hidden":"true"},C2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},O2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.873ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 828 683","aria-hidden":"true"},R2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.621ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 1158.5 647","aria-hidden":"true"},A2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.576ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.672ex",height:"2.498ex",role:"img",focusable:"false",viewBox:"0 -849.5 6927 1104.3","aria-hidden":"true"},X2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.554ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 1128.8 647","aria-hidden":"true"},z2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.239ex",height:"1.902ex",role:"img",focusable:"false",viewBox:"0 -683 1431.5 840.8","aria-hidden":"true"},G2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},J2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.8ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.709ex",height:"2.495ex",role:"img",focusable:"false",viewBox:"0 -749.5 4291.3 1103","aria-hidden":"true"},E2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},P2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.371ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -683 1048 705","aria-hidden":"true"},q2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.564ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.885ex",height:"2.26ex",role:"img",focusable:"false",viewBox:"0 -749.5 1717.4 999","aria-hidden":"true"},W2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},K2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.695ex",height:"1.538ex",role:"img",focusable:"false",viewBox:"0 -680 749 680","aria-hidden":"true"},U2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},$2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"2.378ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 1051 683","aria-hidden":"true"},Y2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},_2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"35.489ex",height:"4.676ex",role:"img",focusable:"false",viewBox:"0 -1370 15686 2067","aria-hidden":"true"},Q4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},t4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.576ex"},xmlns:"http://www.w3.org/2000/svg",width:"29.728ex",height:"2.498ex",role:"img",focusable:"false",viewBox:"0 -849.5 13139.6 1104.3","aria-hidden":"true"},a4={class:"tip custom-block"},T4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.991ex",height:"3.006ex",role:"img",focusable:"false",viewBox:"0 -975.7 1763.8 1328.5","aria-hidden":"true"},l4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},s4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"31.943ex",height:"3.006ex",role:"img",focusable:"false",viewBox:"0 -975.7 14118.6 1328.5","aria-hidden":"true"},m4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.701ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -716 1194 727","aria-hidden":"true"},n4={class:"tip custom-block"},d4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.541ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 681 683","aria-hidden":"true"},i4={class:"tip custom-block"},h4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.247ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 993.3 636","aria-hidden":"true"},g4={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},H4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"41.494ex",height:"4.676ex",role:"img",focusable:"false",viewBox:"0 -1370 18340.4 2067","aria-hidden":"true"},u4={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},c4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"53.126ex",height:"4.676ex",role:"img",focusable:"false",viewBox:"0 -1370 23481.8 2067","aria-hidden":"true"},w4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.966ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 7057.1 1083.9","aria-hidden":"true"},L4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"3.773ex",height:"1.887ex",role:"img",focusable:"false",viewBox:"0 -833.9 1667.7 833.9","aria-hidden":"true"},y4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.781ex"},xmlns:"http://www.w3.org/2000/svg",width:"26.759ex",height:"2.97ex",role:"img",focusable:"false",viewBox:"0 -967.8 11827.4 1312.8","aria-hidden":"true"},k4={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},V4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"18.127ex",height:"2.185ex",role:"img",focusable:"false",viewBox:"0 -883.9 8012.2 965.9","aria-hidden":"true"},Z4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.957ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 4843 1083.9","aria-hidden":"true"},v4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"18.264ex",height:"2.32ex",role:"img",focusable:"false",viewBox:"0 -775.2 8072.7 1025.2","aria-hidden":"true"},j4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"18.264ex",height:"2.32ex",role:"img",focusable:"false",viewBox:"0 -775.2 8072.7 1025.2","aria-hidden":"true"},O4={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},R4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"24.286ex",height:"2.36ex",role:"img",focusable:"false",viewBox:"0 -961.2 10734.5 1043.2","aria-hidden":"true"},F4={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},A4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-8.999ex"},xmlns:"http://www.w3.org/2000/svg",width:"49.753ex",height:"19.129ex",role:"img",focusable:"false",viewBox:"0 -4477.6 21990.6 8455.2","aria-hidden":"true"},B4={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},X4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-8.191ex"},xmlns:"http://www.w3.org/2000/svg",width:"60.665ex",height:"17.514ex",role:"img",focusable:"false",viewBox:"0 -4120.6 26813.9 7741.1","aria-hidden":"true"};function S4(z4,t,I4,G4,J4,E4){return e(),T("div",null,[t[384]||(t[384]=Q("h1",{id:"Spatial-discretization",tabindex:"-1"},[a("Spatial discretization "),Q("a",{class:"header-anchor",href:"#Spatial-discretization","aria-label":'Permalink to "Spatial discretization {#Spatial-discretization}"'},"")],-1)),Q("p",null,[t[36]||(t[36]=a("the ")),Q("mjx-container",n,[(e(),T("svg",d,t[0]||(t[0]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D451",d:"M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z",style:{"stroke-width":"3"}})])])],-1)]))),t[1]||(t[1]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"d")])],-1))]),t[37]||(t[37]=a(" spatial dimensions are indexed by ")),Q("mjx-container",r,[(e(),T("svg",i,t[2]||(t[2]=[l(' ',1)]))),t[3]||(t[3]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α"),Q("mo",null,"∈"),Q("mo",{fence:"false",stretchy:"false"},"{"),Q("mn",null,"1"),Q("mo",null,","),Q("mo",null,"…"),Q("mo",null,","),Q("mi",null,"d"),Q("mo",{fence:"false",stretchy:"false"},"}")])],-1))]),t[38]||(t[38]=a(". The ")),Q("mjx-container",h,[(e(),T("svg",p,t[4]||(t[4]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D6FC",d:"M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z",style:{"stroke-width":"3"}})])])],-1)]))),t[5]||(t[5]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α")])],-1))]),t[39]||(t[39]=a("-th unit vector is denoted ")),Q("mjx-container",g,[(e(),T("svg",H,t[6]||(t[6]=[l(' ',1)]))),t[7]||(t[7]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"e"),Q("mi",null,"α")]),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"e"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mi",null,"β")])]),Q("msubsup",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"β"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")])])],-1))]),t[40]||(t[40]=a(", where the Kronecker symbol ")),Q("mjx-container",u,[(e(),T("svg",c,t[8]||(t[8]=[l(' ',1)]))),t[9]||(t[9]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"e"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mi",null,"β")])])])],-1))]),t[41]||(t[41]=a(" is ")),Q("mjx-container",w,[(e(),T("svg",x,t[10]||(t[10]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mn"},[Q("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1)]))),t[11]||(t[11]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mn",null,"1")])],-1))]),t[42]||(t[42]=a(" if ")),Q("mjx-container",L,[(e(),T("svg",f,t[12]||(t[12]=[l(' ',1)]))),t[13]||(t[13]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mi",null,"β")])],-1))]),t[43]||(t[43]=a(" and ")),Q("mjx-container",y,[(e(),T("svg",M,t[14]||(t[14]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mn"},[Q("path",{"data-c":"30",d:"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z",style:{"stroke-width":"3"}})])])],-1)]))),t[15]||(t[15]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mn",null,"0")])],-1))]),t[44]||(t[44]=a(" otherwise. We note ")),Q("mjx-container",k,[(e(),T("svg",V,t[16]||(t[16]=[l(' ',1)]))),t[17]||(t[17]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")]),Q("mo",null,"="),Q("msub",null,[Q("mi",null,"e"),Q("mi",null,"α")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")])],-1))]),t[45]||(t[45]=a(". The Cartesian index ")),Q("mjx-container",Z,[(e(),T("svg",b,t[18]||(t[18]=[l(' ',1)]))),t[19]||(t[19]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,","),Q("mo",null,"…"),Q("mo",null,","),Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},")")])],-1))]),t[46]||(t[46]=a(" is used to avoid repeating terms and equations ")),Q("mjx-container",v,[(e(),T("svg",D,t[20]||(t[20]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D451",d:"M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z",style:{"stroke-width":"3"}})])])],-1)]))),t[21]||(t[21]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"d")])],-1))]),t[47]||(t[47]=a(" times, where ")),Q("mjx-container",j,[(e(),T("svg",C,t[22]||(t[22]=[l(' ',1)]))),t[23]||(t[23]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")])])],-1))]),t[48]||(t[48]=a(" is a scalar index (typically one of ")),Q("mjx-container",O,[(e(),T("svg",R,t[24]||(t[24]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D456",d:"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),t[25]||(t[25]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"i")])],-1))]),t[49]||(t[49]=a(", ")),Q("mjx-container",F,[(e(),T("svg",A,t[26]||(t[26]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D457",d:"M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z",style:{"stroke-width":"3"}})])])],-1)]))),t[27]||(t[27]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"j")])],-1))]),t[50]||(t[50]=a(", and ")),Q("mjx-container",B,[(e(),T("svg",X,t[28]||(t[28]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1)]))),t[29]||(t[29]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"k")])],-1))]),t[51]||(t[51]=a(" in common notation). This notation is dimension-agnostic, since we can write ")),Q("mjx-container",S,[(e(),T("svg",z,t[30]||(t[30]=[l(' ',1)]))),t[31]||(t[31]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"I")])])],-1))]),t[52]||(t[52]=a(" instead of ")),Q("mjx-container",I,[(e(),T("svg",G,t[32]||(t[32]=[l(' ',1)]))),t[33]||(t[33]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mi",null,"j")])])])],-1))]),t[53]||(t[53]=a(" in 2D or ")),Q("mjx-container",J,[(e(),T("svg",E,t[34]||(t[34]=[l(' ',1)]))),t[35]||(t[35]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mi",null,"j"),Q("mi",null,"k")])])])],-1))]),t[54]||(t[54]=a(" in 3D. In our Julia implementation of the solver we use the same Cartesian notation (")),t[55]||(t[55]=Q("code",null,"u[I]",-1)),t[56]||(t[56]=a(" instead of ")),t[57]||(t[57]=Q("code",null,"u[i, j]",-1)),t[58]||(t[58]=a(" or ")),t[59]||(t[59]=Q("code",null,"u[i, j, k]",-1)),t[60]||(t[60]=a(")."))]),Q("p",null,[t[91]||(t[91]=a("For the discretization scheme, we use a staggered Cartesian grid as proposed by Harlow and Welch [")),t[92]||(t[92]=Q("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Harlow1965"},"13",-1)),t[93]||(t[93]=a("]. Consider a rectangular domain ")),Q("mjx-container",P,[(e(),T("svg",q,t[61]||(t[61]=[l(' ',1)]))),t[62]||(t[62]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",{mathvariant:"normal"},"Ω"),Q("mo",null,"="),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∏"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"["),Q("msub",null,[Q("mi",null,"a"),Q("mi",null,"α")]),Q("mo",null,","),Q("msub",null,[Q("mi",null,"b"),Q("mi",null,"α")]),Q("mo",{stretchy:"false"},"]")])],-1))]),t[94]||(t[94]=a(", where ")),Q("mjx-container",N,[(e(),T("svg",W,t[63]||(t[63]=[l(' ',1)]))),t[64]||(t[64]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"a"),Q("mi",null,"α")]),Q("mo",null,"<"),Q("msub",null,[Q("mi",null,"b"),Q("mi",null,"α")])])],-1))]),t[95]||(t[95]=a(" are the domain boundaries and ")),Q("mjx-container",K,[(e(),T("svg",U,t[65]||(t[65]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mo"},[Q("path",{"data-c":"220F",d:"M158 656Q147 684 131 694Q110 707 69 710H55V750H888V710H874Q840 708 820 698T795 678T786 656V-155Q798 -206 874 -210H888V-250H570V-210H584Q618 -208 638 -197T663 -178T673 -155V710H270V277L271 -155Q283 -206 359 -210H373V-250H55V-210H69Q103 -208 123 -197T148 -178T158 -155V656Z",style:{"stroke-width":"3"}})])])],-1)]))),t[66]||(t[66]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{"data-mjx-texclass":"OP"},"∏")])],-1))]),t[96]||(t[96]=a(" is a Cartesian product. Let ")),Q("mjx-container",$,[(e(),T("svg",Y,t[67]||(t[67]=[l(' ',1)]))),t[68]||(t[68]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",{mathvariant:"normal"},"Ω"),Q("mo",null,"="),Q("munder",null,[Q("mo",{"data-mjx-texclass":"OP"},"⋃"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")])])]),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")])])],-1))]),t[97]||(t[97]=a(" be a partitioning of ")),Q("mjx-container",_,[(e(),T("svg",Q1,t[69]||(t[69]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"3A9",d:"M55 454Q55 503 75 546T127 617T197 665T272 695T337 704H352Q396 704 404 703Q527 687 596 615T666 454Q666 392 635 330T559 200T499 83V80H543Q589 81 600 83T617 93Q622 102 629 135T636 172L637 177H677V175L660 89Q645 3 644 2V0H552H488Q461 0 456 3T451 20Q451 89 499 235T548 455Q548 512 530 555T483 622T424 656T361 668Q332 668 303 658T243 626T193 560T174 456Q174 380 222 233T270 20Q270 7 263 0H77V2Q76 3 61 89L44 175V177H84L85 172Q85 171 88 155T96 119T104 93Q109 86 120 84T178 80H222V83Q206 132 162 199T87 329T55 454Z",style:{"stroke-width":"3"}})])])],-1)]))),t[70]||(t[70]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",{mathvariant:"normal"},"Ω")])],-1))]),t[98]||(t[98]=a(", where ")),Q("mjx-container",t1,[(e(),T("svg",a1,t[71]||(t[71]=[l(' ',1)]))),t[72]||(t[72]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")]),Q("mo",null,"="),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∏"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{fence:"false",stretchy:"false"},"{"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")]),Q("mo",null,","),Q("mn",null,"2"),Q("mo",null,"−"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")]),Q("mo",null,","),Q("mo",null,"…"),Q("mo",null,","),Q("msub",null,[Q("mi",null,"N"),Q("mi",null,"α")]),Q("mo",null,"−"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")]),Q("mo",{fence:"false",stretchy:"false"},"}")])],-1))]),t[99]||(t[99]=a(" are volume center indices, ")),Q("mjx-container",T1,[(e(),T("svg",e1,t[73]||(t[73]=[l(' ',1)]))),t[74]||(t[74]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"N"),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"N"),Q("mn",null,"1")]),Q("mo",null,","),Q("mo",null,"…"),Q("mo",null,","),Q("msub",null,[Q("mi",null,"N"),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"∈"),Q("msup",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"double-struck"},"N")]),Q("mi",null,"d")])])],-1))]),t[100]||(t[100]=a(" are the number of volumes in each dimension, ")),Q("mjx-container",l1,[(e(),T("svg",s1,t[75]||(t[75]=[l(' ',1)]))),t[76]||(t[76]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")]),Q("mo",null,"="),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∏"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")])]),Q("mi",null,"α")])])],-1))]),t[101]||(t[101]=a(" is a finite volume, ")),Q("mjx-container",m1,[(e(),T("svg",o1,t[77]||(t[77]=[l(' ',1)]))),t[78]||(t[78]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mi",null,"I"),Q("mi",null,"α")]),Q("mo",null,"="),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])]),Q("mo",null,"∩"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])]),Q("mo",null,"="),Q("munder",null,[Q("mo",{"data-mjx-texclass":"OP"},"∏"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"β"),Q("mo",null,"≠"),Q("mi",null,"α")])]),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"β")])]),Q("mi",null,"β")])])],-1))]),t[102]||(t[102]=a(" is a volume face, ")),Q("mjx-container",n1,[(e(),T("svg",d1,t[79]||(t[79]=[l(' ',1)]))),t[80]||(t[80]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mi",null,"i"),Q("mi",null,"α")]),Q("mo",null,"="),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"["),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"−"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")])]),Q("mi",null,"α")]),Q("mo",null,","),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"+"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")])]),Q("mi",null,"α")]),Q("mo",{"data-mjx-texclass":"CLOSE"},"]")])])],-1))]),t[103]||(t[103]=a(" is a volume edge, ")),Q("mjx-container",r1,[(e(),T("svg",i1,t[81]||(t[81]=[l(' ',1)]))),t[82]||(t[82]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",null,"x"),Q("mn",null,"0"),Q("mi",null,"α")]),Q("mo",null,","),Q("mo",null,"…"),Q("mo",null,","),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"N"),Q("mi",null,"α")])]),Q("mi",null,"α")])])],-1))]),t[104]||(t[104]=a(" are volume boundary coordinates, and ")),Q("mjx-container",h1,[(e(),T("svg",p1,t[83]||(t[83]=[l(' ',1)]))),t[84]||(t[84]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",null,"x"),Q("mi",null,"i"),Q("mi",null,"α")]),Q("mo",null,"="),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")]),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"("),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"−"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")])]),Q("mi",null,"α")]),Q("mo",null,"+"),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"+"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")])]),Q("mi",null,"α")]),Q("mo",{"data-mjx-texclass":"CLOSE"},")")])])],-1))]),t[105]||(t[105]=a(" for ")),Q("mjx-container",g1,[(e(),T("svg",H1,t[85]||(t[85]=[l(' ',1)]))),t[86]||(t[86]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"i"),Q("mo",null,"∈"),Q("mo",{fence:"false",stretchy:"false"},"{"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2"),Q("mo",null,","),Q("mo",null,"…"),Q("mo",null,","),Q("msub",null,[Q("mi",null,"N"),Q("mi",null,"α")]),Q("mo",null,"−"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2"),Q("mo",{fence:"false",stretchy:"false"},"}")])],-1))]),t[106]||(t[106]=a(" are volume center coordinates. We also define the operator ")),Q("mjx-container",u1,[(e(),T("svg",c1,t[87]||(t[87]=[l(' ',1)]))),t[88]||(t[88]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"α")])])],-1))]),t[107]||(t[107]=a(" which maps a discrete scalar field ")),Q("mjx-container",w1,[(e(),T("svg",x1,t[89]||(t[89]=[l(' ',1)]))),t[90]||(t[90]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"φ"),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"φ"),Q("mi",null,"I")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"I")])])],-1))]),t[108]||(t[108]=a(" to"))]),Q("mjx-container",L1,[(e(),T("svg",f1,t[109]||(t[109]=[l(' ',1)]))),t[110]||(t[110]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"α")]),Q("mi",null,"φ"),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"I")]),Q("mo",null,"="),Q("mfrac",null,[Q("mrow",null,[Q("msub",null,[Q("mi",null,"φ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"φ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])])]),Q("mrow",null,[Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")])]),Q("mi",null,"α")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])]),Q("mo",null,".")])],-1))]),Q("p",null,[t[119]||(t[119]=a("It can be interpreted as a discrete equivalent of the continuous operator ")),Q("mjx-container",y1,[(e(),T("svg",M1,t[111]||(t[111]=[l(' ',1)]))),t[112]||(t[112]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mfrac",null,[Q("mi",null,"∂"),Q("mrow",null,[Q("mi",null,"∂"),Q("msup",null,[Q("mi",null,"x"),Q("mi",null,"α")])])])])],-1))]),t[120]||(t[120]=a(". All the above definitions are extended to be valid in volume centers ")),Q("mjx-container",k1,[(e(),T("svg",V1,t[113]||(t[113]=[l(' ',1)]))),t[114]||(t[114]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")])])],-1))]),t[121]||(t[121]=a(", volume faces ")),Q("mjx-container",Z1,[(e(),T("svg",b1,t[115]||(t[115]=[l(' ',1)]))),t[116]||(t[116]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])],-1))]),t[122]||(t[122]=a(", or volume corners ")),Q("mjx-container",v1,[(e(),T("svg",D1,t[117]||(t[117]=[l(' ',1)]))),t[118]||(t[118]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")]),Q("mo",null,"+"),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])],-1))]),t[123]||(t[123]=a(". The discretization is illustrated below:"))]),t[385]||(t[385]=Q("p",null,[Q("img",{src:m,alt:""})],-1)),t[386]||(t[386]=Q("h2",{id:"Finite-volume-discretization-of-the-Navier-Stokes-equations",tabindex:"-1"},[a("Finite volume discretization of the Navier-Stokes equations "),Q("a",{class:"header-anchor",href:"#Finite-volume-discretization-of-the-Navier-Stokes-equations","aria-label":'Permalink to "Finite volume discretization of the Navier-Stokes equations {#Finite-volume-discretization-of-the-Navier-Stokes-equations}"'},"")],-1)),Q("p",null,[t[150]||(t[150]=a("We now define the unknown degrees of freedom. The average pressure in ")),Q("mjx-container",j1,[(e(),T("svg",C1,t[124]||(t[124]=[l(' ',1)]))),t[125]||(t[125]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")])])],-1))]),t[151]||(t[151]=a(", ")),Q("mjx-container",O1,[(e(),T("svg",R1,t[126]||(t[126]=[l(' ',1)]))),t[127]||(t[127]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")])])],-1))]),t[152]||(t[152]=a(" is approximated by the quantity ")),Q("mjx-container",F1,[(e(),T("svg",A1,t[128]||(t[128]=[l(' ',1)]))),t[129]||(t[129]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"p"),Q("mi",null,"I")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"t"),Q("mo",{stretchy:"false"},")")])],-1))]),t[153]||(t[153]=a(". The average ")),Q("mjx-container",B1,[(e(),T("svg",X1,t[130]||(t[130]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D6FC",d:"M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z",style:{"stroke-width":"3"}})])])],-1)]))),t[131]||(t[131]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α")])],-1))]),t[154]||(t[154]=a("-velocity on the face ")),Q("mjx-container",S1,[(e(),T("svg",z1,t[132]||(t[132]=[l(' ',1)]))),t[133]||(t[133]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mi",null,"I"),Q("mi",null,"α")])])],-1))]),t[155]||(t[155]=a(", ")),Q("mjx-container",I1,[(e(),T("svg",G1,t[134]||(t[134]=[l(' ',1)]))),t[135]||(t[135]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])],-1))]),t[156]||(t[156]=a(" is approximated by the quantity ")),Q("mjx-container",J1,[(e(),T("svg",E1,t[136]||(t[136]=[l(' ',1)]))),t[137]||(t[137]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",null,"u"),Q("mi",null,"I"),Q("mi",null,"α")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"t"),Q("mo",{stretchy:"false"},")")])],-1))]),t[157]||(t[157]=a(". Note how the pressure ")),Q("mjx-container",P1,[(e(),T("svg",q1,t[138]||(t[138]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D45D",d:"M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z",style:{"stroke-width":"3"}})])])],-1)]))),t[139]||(t[139]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"p")])],-1))]),t[158]||(t[158]=a(" and the ")),Q("mjx-container",N1,[(e(),T("svg",W1,t[140]||(t[140]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D451",d:"M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z",style:{"stroke-width":"3"}})])])],-1)]))),t[141]||(t[141]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"d")])],-1))]),t[159]||(t[159]=a(" velocity fields ")),Q("mjx-container",K1,[(e(),T("svg",U1,t[142]||(t[142]=[l(' ',1)]))),t[143]||(t[143]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")])])],-1))]),t[160]||(t[160]=a(" are each defined in their own canonical positions ")),Q("mjx-container",$1,[(e(),T("svg",Y1,t[144]||(t[144]=[l(' ',1)]))),t[145]||(t[145]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"x"),Q("mi",null,"I")])])],-1))]),t[161]||(t[161]=a(" and ")),Q("mjx-container",_1,[(e(),T("svg",Q3,t[146]||(t[146]=[l(' ',1)]))),t[147]||(t[147]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])])])],-1))]),t[162]||(t[162]=a(" for ")),Q("mjx-container",t3,[(e(),T("svg",a3,t[148]||(t[148]=[l(' ',1)]))),t[149]||(t[149]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")])])],-1))]),t[163]||(t[163]=a(". In the following, we derive equations for these unknowns."))]),Q("p",null,[t[170]||(t[170]=a("Using the pressure control volume ")),Q("mjx-container",T3,[(e(),T("svg",e3,t[164]||(t[164]=[l(' ',1)]))),t[165]||(t[165]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),Q("mo",null,"="),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")])])],-1))]),t[171]||(t[171]=a(" with ")),Q("mjx-container",l3,[(e(),T("svg",s3,t[166]||(t[166]=[l(' ',1)]))),t[167]||(t[167]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")])])],-1))]),t[172]||(t[172]=a(" in the mass integral constraint and approximating the face integrals with the mid-point quadrature rule ")),Q("mjx-container",m3,[(e(),T("svg",o3,t[168]||(t[168]=[l(' ',1)]))),t[169]||(t[169]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mi",null,"I")])])]),Q("mi",null,"u"),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Γ"),Q("mo",null,"≈"),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mi",null,"I")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"I")])])],-1))]),t[173]||(t[173]=a(" results in the discrete divergence-free constraint"))]),Q("mjx-container",n3,[(e(),T("svg",d3,t[174]||(t[174]=[l(' ',1)]))),t[175]||(t[175]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"α")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"I")]),Q("mo",null,"="),Q("mn",null,"0.")])],-1))]),Q("p",null,[t[178]||(t[178]=a("Note how dividing by the volume size results in a discrete equation resembling the continuous one (since ")),Q("mjx-container",r3,[(e(),T("svg",i3,t[176]||(t[176]=[l(' ',1)]))),t[177]||(t[177]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("mo",null,"="),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mi",null,"I"),Q("mi",null,"α")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")])]),Q("mi",null,"α")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),t[179]||(t[179]=a(")."))]),Q("p",null,[t[186]||(t[186]=a("Similarly, choosing an ")),Q("mjx-container",h3,[(e(),T("svg",p3,t[180]||(t[180]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D6FC",d:"M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z",style:{"stroke-width":"3"}})])])],-1)]))),t[181]||(t[181]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α")])],-1))]),t[187]||(t[187]=a("-velocity control volume ")),Q("mjx-container",g3,[(e(),T("svg",H3,t[182]||(t[182]=[l(' ',1)]))),t[183]||(t[183]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),Q("mo",null,"="),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])])])],-1))]),t[188]||(t[188]=a(" with ")),Q("mjx-container",u3,[(e(),T("svg",c3,t[184]||(t[184]=[l(' ',1)]))),t[185]||(t[185]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])],-1))]),t[189]||(t[189]=a(" in the integral momentum equation, approximating the volume- and face integrals using the mid-point quadrature rule, and replacing remaining spatial derivatives in the diffusive term with a finite difference approximation gives the discrete momentum equations"))]),Q("mjx-container",w3,[(e(),T("svg",x3,t[190]||(t[190]=[l(' ',1)]))),t[191]||(t[191]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mfrac",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")]),Q("mi",null,"α")]),Q("mo",null,"="),Q("mo",null,"−"),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"β"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("mo",{stretchy:"false"},"("),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"β")]),Q("mo",{stretchy:"false"},")"),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",null,"+"),Q("mi",null,"ν"),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"β"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",null,"+"),Q("msup",null,[Q("mi",null,"f"),Q("mi",null,"α")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"α")]),Q("mi",null,"p"),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",null,".")])],-1))]),Q("p",null,[t[220]||(t[220]=a("where we made the assumption that ")),Q("mjx-container",L3,[(e(),T("svg",f3,t[192]||(t[192]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D453",d:"M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z",style:{"stroke-width":"3"}})])])],-1)]))),t[193]||(t[193]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"f")])],-1))]),t[221]||(t[221]=a(" is constant in time for simplicity. The outer discrete derivative in ")),Q("mjx-container",y3,[(e(),T("svg",M3,t[194]||(t[194]=[l(' ',1)]))),t[195]||(t[195]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])])])],-1))]),t[222]||(t[222]=a(" is required at the position ")),Q("mjx-container",k3,[(e(),T("svg",V3,t[196]||(t[196]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D43C",d:"M43 1Q26 1 26 10Q26 12 29 24Q34 43 39 45Q42 46 54 46H60Q120 46 136 53Q137 53 138 54Q143 56 149 77T198 273Q210 318 216 344Q286 624 286 626Q284 630 284 631Q274 637 213 637H193Q184 643 189 662Q193 677 195 680T209 683H213Q285 681 359 681Q481 681 487 683H497Q504 676 504 672T501 655T494 639Q491 637 471 637Q440 637 407 634Q393 631 388 623Q381 609 337 432Q326 385 315 341Q245 65 245 59Q245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2Q143 2 113 2T65 2T43 1Z",style:{"stroke-width":"3"}})])])],-1)]))),t[197]||(t[197]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I")])],-1))]),t[223]||(t[223]=a(", which means that the inner derivative is evaluated as ")),Q("mjx-container",Z3,[(e(),T("svg",b3,t[198]||(t[198]=[l(' ',1)]))),t[199]||(t[199]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"β")])])])])],-1))]),t[224]||(t[224]=a(" and ")),Q("mjx-container",v3,[(e(),T("svg",D3,t[200]||(t[200]=[l(' ',1)]))),t[201]||(t[201]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"β")])])])])],-1))]),t[225]||(t[225]=a(", thus requiring ")),Q("mjx-container",j3,[(e(),T("svg",C3,t[202]||(t[202]=[l(' ',1)]))),t[203]||(t[203]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("mn",null,"2"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"β")])]),Q("mi",null,"α")])])],-1))]),t[226]||(t[226]=a(", ")),Q("mjx-container",O3,[(e(),T("svg",R3,t[204]||(t[204]=[l(' ',1)]))),t[205]||(t[205]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")]),Q("mi",null,"α")])])],-1))]),t[227]||(t[227]=a(", and ")),Q("mjx-container",F3,[(e(),T("svg",A3,t[206]||(t[206]=[l(' ',1)]))),t[207]||(t[207]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("mn",null,"2"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"β")])]),Q("mi",null,"α")])])],-1))]),t[228]||(t[228]=a(", which are all in their canonical positions. The two velocity components in the convective term ")),Q("mjx-container",B3,[(e(),T("svg",X3,t[208]||(t[208]=[l(' ',1)]))),t[209]||(t[209]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"β")])])],-1))]),t[229]||(t[229]=a(" are required at the positions ")),Q("mjx-container",S3,[(e(),T("svg",z3,t[210]||(t[210]=[l(' ',1)]))),t[211]||(t[211]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"β")])])],-1))]),t[230]||(t[230]=a(" and ")),Q("mjx-container",I3,[(e(),T("svg",G3,t[212]||(t[212]=[l(' ',1)]))),t[213]||(t[213]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"β")])])],-1))]),t[231]||(t[231]=a(", which are outside the canonical positions. Their value at the required position is obtained using averaging with weights ")),Q("mjx-container",J3,[(e(),T("svg",E3,t[214]||(t[214]=[l(' ',1)]))),t[215]||(t[215]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")])],-1))]),t[232]||(t[232]=a(" for the ")),Q("mjx-container",P3,[(e(),T("svg",q3,t[216]||(t[216]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D6FC",d:"M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z",style:{"stroke-width":"3"}})])])],-1)]))),t[217]||(t[217]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α")])],-1))]),t[233]||(t[233]=a("-component and with linear interpolation for the ")),Q("mjx-container",N3,[(e(),T("svg",W3,t[218]||(t[218]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D6FD",d:"M29 -194Q23 -188 23 -186Q23 -183 102 134T186 465Q208 533 243 584T309 658Q365 705 429 705H431Q493 705 533 667T573 570Q573 465 469 396L482 383Q533 332 533 252Q533 139 448 65T257 -10Q227 -10 203 -2T165 17T143 40T131 59T126 65L62 -188Q60 -194 42 -194H29ZM353 431Q392 431 427 419L432 422Q436 426 439 429T449 439T461 453T472 471T484 495T493 524T501 560Q503 569 503 593Q503 611 502 616Q487 667 426 667Q384 667 347 643T286 582T247 514T224 455Q219 439 186 308T152 168Q151 163 151 147Q151 99 173 68Q204 26 260 26Q302 26 349 51T425 137Q441 171 449 214T457 279Q457 337 422 372Q380 358 347 358H337Q258 358 258 389Q258 396 261 403Q275 431 353 431Z",style:{"stroke-width":"3"}})])])],-1)]))),t[219]||(t[219]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"β")])],-1))]),t[234]||(t[234]=a("-component. This preserves the skew-symmetry of the convection operator, such that energy is conserved (in the convective term) [")),t[235]||(t[235]=Q("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Verstappen2003"},"14",-1)),t[236]||(t[236]=a("]."))]),t[387]||(t[387]=Q("h2",{id:"Boundary-conditions",tabindex:"-1"},[a("Boundary conditions "),Q("a",{class:"header-anchor",href:"#Boundary-conditions","aria-label":'Permalink to "Boundary conditions {#Boundary-conditions}"'},"")],-1)),Q("div",K3,[t[262]||(t[262]=Q("p",{class:"custom-block-title"},"Storage convention",-1)),Q("p",null,[t[253]||(t[253]=a("We use the column-major convention (Julia, MATLAB, Fortran), and not the row-major convention (Python, C). Thus the ")),Q("mjx-container",U3,[(e(),T("svg",$3,t[237]||(t[237]=[l(' ',1)]))),t[238]||(t[238]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"1")])])],-1))]),t[254]||(t[254]=a("-index ")),Q("mjx-container",Y3,[(e(),T("svg",_3,t[239]||(t[239]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D456",d:"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),t[240]||(t[240]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"i")])],-1))]),t[255]||(t[255]=a(" will vary for one whole cycle in the vectors before the ")),Q("mjx-container",Q2,[(e(),T("svg",t2,t[241]||(t[241]=[l(' ',1)]))),t[242]||(t[242]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"2")])])],-1))]),t[256]||(t[256]=a("-index ")),Q("mjx-container",a2,[(e(),T("svg",T2,t[243]||(t[243]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D457",d:"M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z",style:{"stroke-width":"3"}})])])],-1)]))),t[244]||(t[244]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"j")])],-1))]),t[257]||(t[257]=a(", ")),Q("mjx-container",e2,[(e(),T("svg",l2,t[245]||(t[245]=[l(' ',1)]))),t[246]||(t[246]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"3")])])],-1))]),t[258]||(t[258]=a(" index ")),Q("mjx-container",s2,[(e(),T("svg",m2,t[247]||(t[247]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1)]))),t[248]||(t[248]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"k")])],-1))]),t[259]||(t[259]=a(", and component-index ")),Q("mjx-container",o2,[(e(),T("svg",n2,t[249]||(t[249]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D6FC",d:"M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z",style:{"stroke-width":"3"}})])])],-1)]))),t[250]||(t[250]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α")])],-1))]),t[260]||(t[260]=a(" are incremented, e.g. ")),Q("mjx-container",d2,[(e(),T("svg",r2,t[251]||(t[251]=[l(' ',1)]))),t[252]||(t[252]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",{stretchy:"false"},"("),Q("mn",null,"1"),Q("mo",null,","),Q("mn",null,"1"),Q("mo",null,","),Q("mn",null,"1"),Q("mo",{stretchy:"false"},")")]),Q("mn",null,"1")]),Q("mo",null,","),Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",{stretchy:"false"},"("),Q("mn",null,"2"),Q("mo",null,","),Q("mn",null,"1"),Q("mo",null,","),Q("mn",null,"1"),Q("mo",{stretchy:"false"},")")]),Q("mn",null,"1")]),Q("mo",null,","),Q("mo",null,"…"),Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"N"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"u"),Q("mn",null,"3")])])]),Q("mo",{stretchy:"false"},"("),Q("mn",null,"1"),Q("mo",{stretchy:"false"},")"),Q("mo",null,","),Q("msub",null,[Q("mi",null,"N"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"u"),Q("mn",null,"3")])])]),Q("mo",{stretchy:"false"},"("),Q("mn",null,"2"),Q("mo",{stretchy:"false"},")"),Q("mo",null,","),Q("msub",null,[Q("mi",null,"N"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"u"),Q("mn",null,"3")])])]),Q("mo",{stretchy:"false"},"("),Q("mn",null,"3"),Q("mo",{stretchy:"false"},")"),Q("mo",{stretchy:"false"},")")]),Q("mn",null,"3")]),Q("mo",{stretchy:"false"},")")])],-1))]),t[261]||(t[261]=a(" in 3D."))])]),t[388]||(t[388]=Q("h2",{id:"Fourth-order-accurate-discretization",tabindex:"-1"},[a("Fourth order accurate discretization "),Q("a",{class:"header-anchor",href:"#Fourth-order-accurate-discretization","aria-label":'Permalink to "Fourth order accurate discretization {#Fourth-order-accurate-discretization}"'},"")],-1)),t[389]||(t[389]=Q("p",null,[a("The above discretization is second order accurate. A fourth order accurate discretization can be obtained by judiciously combining the second order discretization with itself on a grid with three times larger cells in each dimension ["),Q("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Verstappen2003"},"14"),a("] ["),Q("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Sanderse2014"},"15"),a("]. The coarse discretization is identical, but the mass equation is derived for the three times coarser control volume")],-1)),Q("mjx-container",i2,[(e(),T("svg",h2,t[263]||(t[263]=[l(' ',1)]))),t[264]||(t[264]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I"),Q("mn",null,"3")]),Q("mo",null,"="),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"⋃"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"e"),Q("mi",null,"α")])])]),Q("mo",null,"∪"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")]),Q("mo",null,"∪"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"e"),Q("mi",null,"α")])])]),Q("mo",null,",")])],-1))]),Q("p",null,[t[267]||(t[267]=a("while the momentum equation is derived for its shifted variant ")),Q("mjx-container",p2,[(e(),T("svg",g2,t[265]||(t[265]=[l(' ',1)]))),t[266]||(t[266]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])]),Q("mn",null,"3")])])],-1))]),t[268]||(t[268]=a(". The resulting fourth order accurate equations are given by"))]),Q("mjx-container",H2,[(e(),T("svg",u2,t[269]||(t[269]=[l(' ',1)]))),t[270]||(t[270]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"α")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"I")]),Q("mo",null,"−"),Q("mfrac",null,[Q("mrow",null,[Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I"),Q("mn",null,"3")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")]),Q("mrow",null,[Q("msup",null,[Q("mn",null,"3"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mn",null,"2"),Q("mo",null,"+"),Q("mi",null,"d")])]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msubsup",null,[Q("mi",null,"δ"),Q("mi",null,"α"),Q("mn",null,"3")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"I")]),Q("mo",null,"="),Q("mn",null,"0")])],-1))]),t[390]||(t[390]=Q("p",null,"and",-1)),Q("mjx-container",c2,[(e(),T("svg",w2,t[271]||(t[271]=[l(' ',1)]))),t[272]||(t[272]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mfrac",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")]),Q("mi",null,"α")]),Q("mo",null,"="),Q("mo",null,"−"),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"β"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("mo",{stretchy:"false"},"("),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"β")]),Q("mo",{stretchy:"false"},")"),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",null,"+"),Q("mi",null,"ν"),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"β"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",null,"+"),Q("msup",null,[Q("mi",null,"f"),Q("mi",null,"α")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"α")]),Q("mi",null,"p"),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",null,"+"),Q("mtext",null,"fourth order"),Q("mo",null,",")])],-1))]),t[391]||(t[391]=Q("p",null,"where",-1)),Q("mjx-container",x2,[(e(),T("svg",L2,t[273]||(t[273]=[l(' ',1)]))),t[274]||(t[274]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mo",{stretchy:"false"},"("),Q("msubsup",null,[Q("mi",null,"δ"),Q("mi",null,"α"),Q("mn",null,"3")]),Q("mi",null,"φ"),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"I")]),Q("mo",null,"="),Q("mfrac",null,[Q("mrow",null,[Q("msub",null,[Q("mi",null,"φ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("mn",null,"3"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"φ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("mn",null,"3"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])])]),Q("mrow",null,[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")]),Q("mo",null,"−"),Q("mn",null,"1")]),Q("mi",null,"α")]),Q("mo",null,"+"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")])]),Q("mi",null,"α")]),Q("mo",null,"+"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")]),Q("mo",null,"+"),Q("mn",null,"1")]),Q("mi",null,"α")])])]),Q("mo",null,".")])],-1))]),t[392]||(t[392]=Q("h2",{id:"Matrix-representation",tabindex:"-1"},[a("Matrix representation "),Q("a",{class:"header-anchor",href:"#Matrix-representation","aria-label":'Permalink to "Matrix representation {#Matrix-representation}"'},"")],-1)),t[393]||(t[393]=Q("p",null,"We can write the mass and momentum equations in matrix form. We will use the same matrix notation for the second- and fourth order accurate discretizations. The discrete mass equation becomes",-1)),Q("mjx-container",f2,[(e(),T("svg",y2,t[275]||(t[275]=[l(' ',1)]))),t[276]||(t[276]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mi",null,"M"),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")]),Q("mo",null,"="),Q("mn",null,"0"),Q("mo",null,",")])],-1))]),Q("p",null,[t[281]||(t[281]=a("where ")),Q("mjx-container",M2,[(e(),T("svg",k2,t[277]||(t[277]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D440",d:"M289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629Z",style:{"stroke-width":"3"}})])])],-1)]))),t[278]||(t[278]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"M")])],-1))]),t[282]||(t[282]=a(" is the discrete divergence operator and ")),Q("mjx-container",V2,[(e(),T("svg",Z2,t[279]||(t[279]=[l(' ',1)]))),t[280]||(t[280]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")])])],-1))]),t[283]||(t[283]=a(" contains the boundary value contributions of the velocity to the divergence field."))]),t[394]||(t[394]=Q("p",null,"The discrete momentum equations become",-1)),Q("mjx-container",b2,[(e(),T("svg",v2,t[284]||(t[284]=[l(' ',1)]))),t[285]||(t[285]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd",null,[Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])])]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mo",null,"−"),Q("mi",null,"C"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"+"),Q("mi",null,"ν"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"D"),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"D")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"f"),Q("mi",null,"h")]),Q("mo",null,"−"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"G"),Q("msub",null,[Q("mi",null,"p"),Q("mi",null,"h")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"G")]),Q("mo",{stretchy:"false"},")")])]),Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mi",null,"F"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"G"),Q("msub",null,[Q("mi",null,"p"),Q("mi",null,"h")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"G")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,",")])])])])],-1))]),Q("p",null,[t[306]||(t[306]=a("where ")),Q("mjx-container",D2,[(e(),T("svg",j2,t[286]||(t[286]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D436",d:"M50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q484 659 454 652T382 628T299 572T226 479Q194 422 175 346T156 222Q156 108 232 58Q280 24 350 24Q441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248Q648 243 647 239Q618 132 523 55T319 -22Q206 -22 128 53T50 252Z",style:{"stroke-width":"3"}})])])],-1)]))),t[287]||(t[287]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"C")])],-1))]),t[307]||(t[307]=a(" is she convection operator (including boundary contributions), ")),Q("mjx-container",C2,[(e(),T("svg",O2,t[288]||(t[288]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D437",d:"M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z",style:{"stroke-width":"3"}})])])],-1)]))),t[289]||(t[289]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"D")])],-1))]),t[308]||(t[308]=a(" is the diffusion operator, ")),Q("mjx-container",R2,[(e(),T("svg",F2,t[290]||(t[290]=[l(' ',1)]))),t[291]||(t[291]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"D")])])],-1))]),t[309]||(t[309]=a(" is boundary contribution to the diffusion term, ")),Q("mjx-container",A2,[(e(),T("svg",B2,t[292]||(t[292]=[l(' ',1)]))),t[293]||(t[293]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"G"),Q("mo",null,"="),Q("msubsup",null,[Q("mi",null,"W"),Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("msup",null,[Q("mi",null,"M"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"sans-serif"},"T")])]),Q("mi",null,"W")])],-1))]),t[310]||(t[310]=a(" is the pressure gradient operator, ")),Q("mjx-container",X2,[(e(),T("svg",S2,t[294]||(t[294]=[l(' ',1)]))),t[295]||(t[295]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"G")])])],-1))]),t[311]||(t[311]=a(" contains the boundary contribution of the pressure to the pressure gradient (only non-zero for pressure boundary conditions), ")),Q("mjx-container",z2,[(e(),T("svg",I2,t[296]||(t[296]=[l(' ',1)]))),t[297]||(t[297]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"W"),Q("mi",null,"u")])])],-1))]),t[312]||(t[312]=a(" is a diagonal matrix containing the velocity volume sizes ")),Q("mjx-container",G2,[(e(),T("svg",J2,t[298]||(t[298]=[l(' ',1)]))),t[299]||(t[299]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("mi",null,"δ"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"α"),Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")])]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),t[313]||(t[313]=a(", and ")),Q("mjx-container",E2,[(e(),T("svg",P2,t[300]||(t[300]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D44A",d:"M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z",style:{"stroke-width":"3"}})])])],-1)]))),t[301]||(t[301]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"W")])],-1))]),t[314]||(t[314]=a(" is a diagonal matrix containing the reference volume sizes ")),Q("mjx-container",q2,[(e(),T("svg",N2,t[302]||(t[302]=[l(' ',1)]))),t[303]||(t[303]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),t[315]||(t[315]=a(". The term ")),Q("mjx-container",W2,[(e(),T("svg",K2,t[304]||(t[304]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D439",d:"M48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1Z",style:{"stroke-width":"3"}})])])],-1)]))),t[305]||(t[305]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"F")])],-1))]),t[316]||(t[316]=a(" refers to all the forces except for the pressure gradient."))]),t[395]||(t[395]=Q("div",{class:"tip custom-block"},[Q("p",{class:"custom-block-title"},"Volume normalization"),Q("p",null,"All the operators have been divided by the velocity volume sizes. As a result, the operators have the same units as their continuous counterparts.")],-1)),t[396]||(t[396]=Q("h2",{id:"Discrete-pressure-Poisson-equation",tabindex:"-1"},[a("Discrete pressure Poisson equation "),Q("a",{class:"header-anchor",href:"#Discrete-pressure-Poisson-equation","aria-label":'Permalink to "Discrete pressure Poisson equation {#Discrete-pressure-Poisson-equation}"'},"")],-1)),Q("p",null,[t[319]||(t[319]=a("Instead of directly discretizing the continuous pressure Poisson equation, we will rededuce it in the ")),t[320]||(t[320]=Q("em",null,"discrete",-1)),t[321]||(t[321]=a(" setting, thus aiming to preserve the discrete divergence freeness instead of the continuous one. Applying the discrete divergence operator ")),Q("mjx-container",U2,[(e(),T("svg",$2,t[317]||(t[317]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D440",d:"M289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629Z",style:{"stroke-width":"3"}})])])],-1)]))),t[318]||(t[318]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"M")])],-1))]),t[322]||(t[322]=a(" to the discrete momentum equations yields the discrete pressure Poisson equation"))]),Q("mjx-container",Y2,[(e(),T("svg",_2,t[323]||(t[323]=[l(' ',1)]))),t[324]||(t[324]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mi",null,"L"),Q("msub",null,[Q("mi",null,"p"),Q("mi",null,"h")]),Q("mo",null,"="),Q("mi",null,"W"),Q("mi",null,"M"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"F"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"G")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"+"),Q("mi",null,"W"),Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("mo",null,",")])],-1))]),Q("p",null,[t[327]||(t[327]=a("where ")),Q("mjx-container",Q4,[(e(),T("svg",t4,t[325]||(t[325]=[l(' ',1)]))),t[326]||(t[326]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"L"),Q("mo",null,"="),Q("mi",null,"W"),Q("mi",null,"M"),Q("mi",null,"G"),Q("mo",null,"="),Q("mi",null,"W"),Q("mi",null,"M"),Q("msubsup",null,[Q("mi",null,"W"),Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("msup",null,[Q("mi",null,"M"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"sans-serif"},"T")])]),Q("mi",null,"W")])],-1))]),t[328]||(t[328]=a(" is a discrete Laplace operator. It is positive symmetric."))]),Q("div",a4,[t[339]||(t[339]=Q("p",{class:"custom-block-title"},"Unsteady Dirichlet boundary conditions",-1)),Q("p",null,[t[335]||(t[335]=a("If the equations are prescribed with unsteady Dirichlet boundary conditions, for example an inflow that varies with time, the term ")),Q("mjx-container",T4,[(e(),T("svg",e4,t[329]||(t[329]=[l(' ',1)]))),t[330]||(t[330]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])])])],-1))]),t[336]||(t[336]=a(" will be non-zero. If this term is not known exactly, for example if the next value of the inflow is unknown at the time of the current value, it must be computed using past values of of the velocity inflow only, for example ")),Q("mjx-container",l4,[(e(),T("svg",s4,t[331]||(t[331]=[l(' ',1)]))),t[332]||(t[332]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("mo",null,"≈"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"t"),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"t"),Q("mo",null,"−"),Q("mi",{mathvariant:"normal"},"Δ"),Q("mi",null,"t"),Q("mo",{stretchy:"false"},")"),Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mi",{mathvariant:"normal"},"Δ"),Q("mi",null,"t")])],-1))]),t[337]||(t[337]=a(" for some ")),Q("mjx-container",m4,[(e(),T("svg",o4,t[333]||(t[333]=[l(' ',1)]))),t[334]||(t[334]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",{mathvariant:"normal"},"Δ"),Q("mi",null,"t")])],-1))]),t[338]||(t[338]=a("."))])]),Q("div",n4,[t[344]||(t[344]=Q("p",{class:"custom-block-title"},"Uniqueness of pressure field",-1)),Q("p",null,[t[342]||(t[342]=a("Unless pressure boundary conditions are present, the pressure is only determined up to a constant, as ")),Q("mjx-container",d4,[(e(),T("svg",r4,t[340]||(t[340]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D43F",d:"M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z",style:{"stroke-width":"3"}})])])],-1)]))),t[341]||(t[341]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"L")])],-1))]),t[343]||(t[343]=a(" will have an eigenvalue of zero. Since only the gradient of the pressure appears in the equations, we can set the unknown constant to zero without affecting the velocity field."))])]),Q("div",i4,[t[360]||(t[360]=Q("p",{class:"custom-block-title"},"Pressure projection",-1)),Q("p",null,[t[347]||(t[347]=a("The pressure field ")),Q("mjx-container",h4,[(e(),T("svg",p4,t[345]||(t[345]=[l(' ',1)]))),t[346]||(t[346]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"p"),Q("mi",null,"h")])])],-1))]),t[348]||(t[348]=a(" can be seen as a Lagrange multiplier enforcing the constraint of discrete divergence freeness. It is also possible to write the momentum equations without the pressure by explicitly solving the discrete Poisson equation:"))]),Q("mjx-container",g4,[(e(),T("svg",H4,t[349]||(t[349]=[l(' ',1)]))),t[350]||(t[350]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("msub",null,[Q("mi",null,"p"),Q("mi",null,"h")]),Q("mo",null,"="),Q("msup",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("mi",null,"W"),Q("mi",null,"M"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"F"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"G")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"+"),Q("msup",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("mi",null,"W"),Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("mo",null,".")])],-1))]),t[361]||(t[361]=Q("p",null,"The momentum equations then become",-1)),Q("mjx-container",u4,[(e(),T("svg",c4,t[351]||(t[351]=[l(' ',1)]))),t[352]||(t[352]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("mi",null,"I"),Q("mo",null,"−"),Q("mi",null,"G"),Q("msup",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("mi",null,"W"),Q("mi",null,"M"),Q("mo",{stretchy:"false"},")"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"F"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"G")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("mi",null,"G"),Q("msup",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("mi",null,"W"),Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("mo",null,".")])],-1))]),Q("p",null,[t[357]||(t[357]=a("The matrix ")),Q("mjx-container",w4,[(e(),T("svg",x4,t[353]||(t[353]=[l(' ',1)]))),t[354]||(t[354]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{stretchy:"false"},"("),Q("mi",null,"I"),Q("mo",null,"−"),Q("mi",null,"G"),Q("msup",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("mi",null,"W"),Q("mi",null,"M"),Q("mo",{stretchy:"false"},")")])],-1))]),t[358]||(t[358]=a(" is a projector onto the space of discretely divergence free velocities. However, using this formulation would require an efficient way to perform the projection without assembling the operator matrix ")),Q("mjx-container",L4,[(e(),T("svg",f4,t[355]||(t[355]=[l(' ',1)]))),t[356]||(t[356]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])])])],-1))]),t[359]||(t[359]=a(", which would be very costly."))])]),t[397]||(t[397]=Q("h2",{id:"Discrete-output-quantities",tabindex:"-1"},[a("Discrete output quantities "),Q("a",{class:"header-anchor",href:"#Discrete-output-quantities","aria-label":'Permalink to "Discrete output quantities {#Discrete-output-quantities}"'},"")],-1)),t[398]||(t[398]=Q("h3",{id:"Kinetic-energy",tabindex:"-1"},[a("Kinetic energy "),Q("a",{class:"header-anchor",href:"#Kinetic-energy","aria-label":'Permalink to "Kinetic energy {#Kinetic-energy}"'},"")],-1)),Q("p",null,[t[364]||(t[364]=a("The local kinetic energy is defined by ")),Q("mjx-container",y4,[(e(),T("svg",M4,t[362]||(t[362]=[l(' ',1)]))),t[363]||(t[363]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"k"),Q("mo",null,"="),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")]),Q("mo",{"data-mjx-texclass":"ORD"},"∥"),Q("mi",null,"u"),Q("msubsup",null,[Q("mo",{"data-mjx-texclass":"ORD"},"∥"),Q("mn",null,"2"),Q("mn",null,"2")]),Q("mo",null,"="),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")])])],-1))]),t[365]||(t[365]=a(". On the staggered grid however, the different velocity components are not located at the same point. We will therefore interpolate the velocity to the pressure point before summing the squares."))]),t[399]||(t[399]=Q("h3",{id:"vorticity",tabindex:"-1"},[a("Vorticity "),Q("a",{class:"header-anchor",href:"#vorticity","aria-label":'Permalink to "Vorticity"'},"")],-1)),t[400]||(t[400]=Q("p",null,"In 2D, the vorticity is a scalar. We define it as",-1)),Q("mjx-container",k4,[(e(),T("svg",V4,t[366]||(t[366]=[l(' ',1)]))),t[367]||(t[367]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mi",null,"ω"),Q("mo",null,"="),Q("mo",null,"−"),Q("msup",null,[Q("mi",null,"δ"),Q("mn",null,"2")]),Q("msup",null,[Q("mi",null,"u"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msup",null,[Q("mi",null,"δ"),Q("mn",null,"1")]),Q("msup",null,[Q("mi",null,"u"),Q("mn",null,"2")]),Q("mo",null,".")])],-1))]),Q("p",null,[t[374]||(t[374]=a("The 3D vorticity is a vector field ")),Q("mjx-container",Z4,[(e(),T("svg",b4,t[368]||(t[368]=[l(' ',1)]))),t[369]||(t[369]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{stretchy:"false"},"("),Q("msup",null,[Q("mi",null,"ω"),Q("mn",null,"1")]),Q("mo",null,","),Q("msup",null,[Q("mi",null,"ω"),Q("mn",null,"2")]),Q("mo",null,","),Q("msup",null,[Q("mi",null,"ω"),Q("mn",null,"3")]),Q("mo",{stretchy:"false"},")")])],-1))]),t[375]||(t[375]=a(". Noting ")),Q("mjx-container",v4,[(e(),T("svg",D4,t[370]||(t[370]=[l(' ',1)]))),t[371]||(t[371]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"α"),Q("mo",null,"+")]),Q("mo",null,"="),Q("msub",null,[Q("mi",null,"mod"),Q("mn",null,"3")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"α"),Q("mo",null,"+"),Q("mn",null,"1"),Q("mo",{stretchy:"false"},")")])],-1))]),t[376]||(t[376]=a(" and ")),Q("mjx-container",j4,[(e(),T("svg",C4,t[372]||(t[372]=[l(' ',1)]))),t[373]||(t[373]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"α"),Q("mo",null,"−")]),Q("mo",null,"="),Q("msub",null,[Q("mi",null,"mod"),Q("mn",null,"3")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"α"),Q("mo",null,"−"),Q("mn",null,"1"),Q("mo",{stretchy:"false"},")")])],-1))]),t[377]||(t[377]=a(", the vorticity is defined as through"))]),Q("mjx-container",O4,[(e(),T("svg",R4,t[378]||(t[378]=[l(' ',1)]))),t[379]||(t[379]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("msup",null,[Q("mi",null,"ω"),Q("mi",null,"α")]),Q("mo",null,"="),Q("mo",null,"−"),Q("msup",null,[Q("mi",null,"δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"α"),Q("mo",null,"−")])])]),Q("msup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"α"),Q("mo",null,"+")])])]),Q("mo",null,"+"),Q("msup",null,[Q("mi",null,"δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"α"),Q("mo",null,"+")])])]),Q("msup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"α"),Q("mo",null,"−")])])]),Q("mo",null,".")])],-1))]),t[401]||(t[401]=Q("h2",{id:"Stream-function",tabindex:"-1"},[a("Stream function "),Q("a",{class:"header-anchor",href:"#Stream-function","aria-label":'Permalink to "Stream function {#Stream-function}"'},"")],-1)),t[402]||(t[402]=Q("p",null,"In 2D, the stream function is defined at the corners with the vorticity. Integrating the stream function Poisson equation over the vorticity volume yields",-1)),Q("mjx-container",F4,[(e(),T("svg",A4,t[380]||(t[380]=[l(' ',1)]))),t[381]||(t[381]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd",null,[Q("mo",null,"−"),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])])]),Q("mi",null,"ω"),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Ω")]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])])]),Q("msup",null,[Q("mi",{mathvariant:"normal"},"∇"),Q("mn",null,"2")]),Q("mi",null,"ψ"),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Ω")])]),Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"e"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])]),Q("mn",null,"1")])])]),Q("mfrac",null,[Q("mrow",null,[Q("mi",null,"∂"),Q("mi",null,"ψ")]),Q("mrow",null,[Q("mi",null,"∂"),Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"1")])])]),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Γ"),Q("mo",null,"−"),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])]),Q("mn",null,"1")])])]),Q("mfrac",null,[Q("mrow",null,[Q("mi",null,"∂"),Q("mi",null,"ψ")]),Q("mrow",null,[Q("mi",null,"∂"),Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"1")])])]),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Γ")])]),Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mi"),Q("mo",null,"+"),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"e"),Q("mn",null,"2")])]),Q("mn",null,"2")])])]),Q("mfrac",null,[Q("mrow",null,[Q("mi",null,"∂"),Q("mi",null,"ψ")]),Q("mrow",null,[Q("mi",null,"∂"),Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"2")])])]),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Γ"),Q("mo",null,"−"),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")])]),Q("mn",null,"2")])])]),Q("mfrac",null,[Q("mrow",null,[Q("mi",null,"∂"),Q("mi",null,"ψ")]),Q("mrow",null,[Q("mi",null,"∂"),Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"2")])])]),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Γ"),Q("mo",null,".")])])])])],-1))]),t[403]||(t[403]=Q("p",null,"Replacing the integrals with the mid-point quadrature rule and the spatial derivatives with central finite differences yields the discrete Poisson equation for the stream function at the vorticity point:",-1)),Q("mjx-container",B4,[(e(),T("svg",X4,t[382]||(t[382]=[l(' ',1)]))),t[383]||(t[383]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd",null,[Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"|"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])]),Q("mn",null,"1")]),Q("mo",{"data-mjx-texclass":"CLOSE"},"|")]),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"("),Q("mfrac",null,[Q("mrow",null,[Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("mn",null,"3"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])]),Q("mrow",null,[Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("mn",null,"3"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"1")]),Q("mo",null,"−"),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"1")])])]),Q("mo",null,"−"),Q("mfrac",null,[Q("mrow",null,[Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])]),Q("mrow",null,[Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"1")]),Q("mo",null,"−"),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,"−"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"1")])])]),Q("mo",{"data-mjx-texclass":"CLOSE"},")")])]),Q("mtd",null,[Q("mi"),Q("mo",null,"+")])]),Q("mtr",null,[Q("mtd",null,[Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"|"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])]),Q("mn",null,"2")]),Q("mo",{"data-mjx-texclass":"CLOSE"},"|")]),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"("),Q("mfrac",null,[Q("mrow",null,[Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("mn",null,"3"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])]),Q("mrow",null,[Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("mn",null,"3"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"2")]),Q("mo",null,"−"),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"2")])])]),Q("mo",null,"−"),Q("mfrac",null,[Q("mrow",null,[Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])]),Q("mrow",null,[Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"2")]),Q("mo",null,"+"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"2")]),Q("mo",null,"−"),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"2")]),Q("mo",null,"−"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"2")])])]),Q("mo",{"data-mjx-texclass":"CLOSE"},")")])]),Q("mtd",null,[Q("mi"),Q("mo",null,"=")])]),Q("mtr",null,[Q("mtd",null,[Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"|"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])]),Q("mo",{"data-mjx-texclass":"CLOSE"},"|")]),Q("msub",null,[Q("mi",null,"ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])]),Q("mtd")])])])],-1))])])}const N4=s(o,[["render",S4]]);export{q4 as __pageData,N4 as default};
diff --git a/previews/PR126/assets/manual_spatial.md.Cj3WsAzX.lean.js b/previews/PR126/assets/manual_spatial.md.Cj3WsAzX.lean.js
new file mode 100644
index 00000000..924ddbd3
--- /dev/null
+++ b/previews/PR126/assets/manual_spatial.md.Cj3WsAzX.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as T,j as Q,a,a5 as l,o as e}from"./chunks/framework.BSoZtefh.js";const m="/IncompressibleNavierStokes.jl/previews/PR126/assets/grid.BpiJkA_F.png",q4=JSON.parse('{"title":"Spatial discretization","description":"","frontmatter":{},"headers":[],"relativePath":"manual/spatial.md","filePath":"manual/spatial.md","lastUpdated":null}'),o={name:"manual/spatial.md"},n={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.023ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.176ex",height:"1.593ex",role:"img",focusable:"false",viewBox:"0 -694 520 704","aria-hidden":"true"},r={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},i={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"13.825ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6110.6 1000","aria-hidden":"true"},h={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.448ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 640 453","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},H={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.04ex"},xmlns:"http://www.w3.org/2000/svg",width:"13.352ex",height:"2.972ex",role:"img",focusable:"false",viewBox:"0 -853.7 5901.8 1313.5","aria-hidden":"true"},u={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.65ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.171ex",height:"1.65ex",role:"img",focusable:"false",viewBox:"0 -442 1401.8 729.2","aria-hidden":"true"},w={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.507ex",role:"img",focusable:"false",viewBox:"0 -666 500 666","aria-hidden":"true"},L={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.746ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -705 2539.6 899","aria-hidden":"true"},y={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.131ex",height:"1.557ex",role:"img",focusable:"false",viewBox:"0 -666 500 688","aria-hidden":"true"},k={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},V={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.06ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4446.7 1000","aria-hidden":"true"},Z={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.957ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6610.8 1000","aria-hidden":"true"},v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.023ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.176ex",height:"1.593ex",role:"img",focusable:"false",viewBox:"0 -694 520 704","aria-hidden":"true"},j={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.207ex",height:"1.902ex",role:"img",focusable:"false",viewBox:"0 -683 975.5 840.8","aria-hidden":"true"},O={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.781ex",height:"1.52ex",role:"img",focusable:"false",viewBox:"0 -661 345 672","aria-hidden":"true"},F={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.462ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.932ex",height:"1.957ex",role:"img",focusable:"false",viewBox:"0 -661 412 865","aria-hidden":"true"},B={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},S={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},z={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.288ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1011.4 592","aria-hidden":"true"},I={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},G={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.666ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.693ex",height:"1.666ex",role:"img",focusable:"false",viewBox:"0 -442 1190.3 736.2","aria-hidden":"true"},J={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.666ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.526ex",height:"1.666ex",role:"img",focusable:"false",viewBox:"0 -442 1558.7 736.2","aria-hidden":"true"},P={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.897ex",height:"2.966ex",role:"img",focusable:"false",viewBox:"0 -967.8 7468.5 1311.1","aria-hidden":"true"},N={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.608ex",height:"1.927ex",role:"img",focusable:"false",viewBox:"0 -694 3362.7 851.8","aria-hidden":"true"},K={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.136ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 944 1000","aria-hidden":"true"},$={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Y={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.708ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.628ex",height:"2.404ex",role:"img",focusable:"false",viewBox:"0 -749.5 5581.6 1062.6","aria-hidden":"true"},_={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.633ex",height:"1.593ex",role:"img",focusable:"false",viewBox:"0 -704 722 704","aria-hidden":"true"},t1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},a1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.781ex"},xmlns:"http://www.w3.org/2000/svg",width:"33.248ex",height:"2.97ex",role:"img",focusable:"false",viewBox:"0 -967.8 14695.6 1312.8","aria-hidden":"true"},T1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"22.887ex",height:"2.497ex",role:"img",focusable:"false",viewBox:"0 -853.7 10116.1 1103.7","aria-hidden":"true"},l1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},s1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.949ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.047ex",height:"3.138ex",role:"img",focusable:"false",viewBox:"0 -967.8 6650.7 1387.1","aria-hidden":"true"},m1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.159ex"},xmlns:"http://www.w3.org/2000/svg",width:"31.899ex",height:"3.398ex",role:"img",focusable:"false",viewBox:"0 -989.3 14099.5 1501.7","aria-hidden":"true"},n1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.539ex"},xmlns:"http://www.w3.org/2000/svg",width:"18.351ex",height:"4.14ex",role:"img",focusable:"false",viewBox:"0 -1149.5 8111.2 1829.8","aria-hidden":"true"},r1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},i1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.949ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.17ex",height:"2.477ex",role:"img",focusable:"false",viewBox:"0 -675.5 4937 1094.8","aria-hidden":"true"},h1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.539ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.881ex",height:"4.14ex",role:"img",focusable:"false",viewBox:"0 -1149.5 9671.5 1829.8","aria-hidden":"true"},g1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},H1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"23.431ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 10356.5 1000","aria-hidden":"true"},u1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.216ex",height:"1.979ex",role:"img",focusable:"false",viewBox:"0 -717 979.5 874.8","aria-hidden":"true"},w1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.725ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4298.3 1000","aria-hidden":"true"},L1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},f1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.558ex"},xmlns:"http://www.w3.org/2000/svg",width:"24.85ex",height:"5.509ex",role:"img",focusable:"false",viewBox:"0 -1304.6 10983.9 2435","aria-hidden":"true"},y1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.817ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.673ex",height:"2.852ex",role:"img",focusable:"false",viewBox:"0 -899.6 1623.4 1260.7","aria-hidden":"true"},k1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},V1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.359ex",height:"1.636ex",role:"img",focusable:"false",viewBox:"0 -683 2368.6 723","aria-hidden":"true"},Z1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.639ex",height:"1.927ex",role:"img",focusable:"false",viewBox:"0 -694 4702.5 851.8","aria-hidden":"true"},v1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.777ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.662ex",height:"2.966ex",role:"img",focusable:"false",viewBox:"0 -967.8 7364.4 1311.1","aria-hidden":"true"},j1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.628ex",height:"1.932ex",role:"img",focusable:"false",viewBox:"0 -704 1161.4 854","aria-hidden":"true"},O1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.359ex",height:"1.636ex",role:"img",focusable:"false",viewBox:"0 -683 2368.6 723","aria-hidden":"true"},F1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.709ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2081.4 1000","aria-hidden":"true"},B1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.448ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 640 453","aria-hidden":"true"},S1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},z1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.696ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.626ex",height:"2.235ex",role:"img",focusable:"false",viewBox:"0 -680 1160.5 987.7","aria-hidden":"true"},I1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},G1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.639ex",height:"1.927ex",role:"img",focusable:"false",viewBox:"0 -694 4702.5 851.8","aria-hidden":"true"},J1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.696ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.083ex",height:"2.393ex",role:"img",focusable:"false",viewBox:"0 -750 2246.5 1057.7","aria-hidden":"true"},P1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.138ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 503 636","aria-hidden":"true"},N1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.023ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.176ex",height:"1.593ex",role:"img",focusable:"false",viewBox:"0 -694 520 704","aria-hidden":"true"},K1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.506ex",height:"1.553ex",role:"img",focusable:"false",viewBox:"0 -675.5 1107.5 686.5","aria-hidden":"true"},$1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Y1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.288ex",height:"1.339ex",role:"img",focusable:"false",viewBox:"0 -442 1011.4 592","aria-hidden":"true"},_1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.592ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.311ex",height:"1.592ex",role:"img",focusable:"false",viewBox:"0 -442 2347.5 703.6","aria-hidden":"true"},t3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},a3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.359ex",height:"1.636ex",role:"img",focusable:"false",viewBox:"0 -683 2368.6 723","aria-hidden":"true"},T3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.446ex",height:"1.934ex",role:"img",focusable:"false",viewBox:"0 -705 3290.9 855","aria-hidden":"true"},l3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},s3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.09ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.359ex",height:"1.636ex",role:"img",focusable:"false",viewBox:"0 -683 2368.6 723","aria-hidden":"true"},m3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.011ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.651ex",height:"2.834ex",role:"img",focusable:"false",viewBox:"0 -805.5 7359.6 1252.4","aria-hidden":"true"},n3={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},d3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.819ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.52ex",height:"6.757ex",role:"img",focusable:"false",viewBox:"0 -1740.7 6860 2986.6","aria-hidden":"true"},r3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},i3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.949ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.677ex",height:"2.644ex",role:"img",focusable:"false",viewBox:"0 -749.5 6929.3 1168.8","aria-hidden":"true"},h3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.448ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 640 453","aria-hidden":"true"},g3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},H3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.339ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.446ex",height:"1.934ex",role:"img",focusable:"false",viewBox:"0 -705 3290.9 855","aria-hidden":"true"},u3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},c3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.639ex",height:"1.927ex",role:"img",focusable:"false",viewBox:"0 -694 4702.5 851.8","aria-hidden":"true"},w3={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},x3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.06ex"},xmlns:"http://www.w3.org/2000/svg",width:"61.46ex",height:"6.999ex",role:"img",focusable:"false",viewBox:"0 -1740.7 27165.4 3093.4","aria-hidden":"true"},L3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.244ex",height:"2.059ex",role:"img",focusable:"false",viewBox:"0 -705 550 910","aria-hidden":"true"},y3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.65ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.456ex",height:"2.347ex",role:"img",focusable:"false",viewBox:"0 -750 4179.4 1037.2","aria-hidden":"true"},k3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},V3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.14ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 504 683","aria-hidden":"true"},Z3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.799ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.297ex",height:"2.496ex",role:"img",focusable:"false",viewBox:"0 -750 4551.3 1103.1","aria-hidden":"true"},v3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.799ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.297ex",height:"2.496ex",role:"img",focusable:"false",viewBox:"0 -750 4551.3 1103.1","aria-hidden":"true"},j3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.173ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.027ex",height:"2.702ex",role:"img",focusable:"false",viewBox:"0 -675.5 2664 1194.1","aria-hidden":"true"},O3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.696ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.506ex",height:"2.225ex",role:"img",focusable:"false",viewBox:"0 -675.5 1107.5 983.3","aria-hidden":"true"},F3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.173ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.027ex",height:"2.702ex",role:"img",focusable:"false",viewBox:"0 -675.5 2664 1194.1","aria-hidden":"true"},B3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.893ex",height:"1.974ex",role:"img",focusable:"false",viewBox:"0 -861.5 2162.8 872.5","aria-hidden":"true"},S3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},z3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.65ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.302ex",height:"2.22ex",role:"img",focusable:"false",viewBox:"0 -694 2785.7 981.2","aria-hidden":"true"},I3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},G3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.65ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.302ex",height:"2.22ex",role:"img",focusable:"false",viewBox:"0 -694 2785.7 981.2","aria-hidden":"true"},J3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.394ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 1500 1000","aria-hidden":"true"},P3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.448ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 640 453","aria-hidden":"true"},N3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.281ex",height:"2.034ex",role:"img",focusable:"false",viewBox:"0 -705 566 899","aria-hidden":"true"},K3={class:"tip custom-block"},U3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},$3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.912ex",role:"img",focusable:"false",viewBox:"0 -833.9 1008.6 844.9","aria-hidden":"true"},Y3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},_3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.781ex",height:"1.52ex",role:"img",focusable:"false",viewBox:"0 -661 345 672","aria-hidden":"true"},Q2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},t2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.912ex",role:"img",focusable:"false",viewBox:"0 -833.9 1008.6 844.9","aria-hidden":"true"},a2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.462ex"},xmlns:"http://www.w3.org/2000/svg",width:"0.932ex",height:"1.957ex",role:"img",focusable:"false",viewBox:"0 -661 412 865","aria-hidden":"true"},e2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.91ex",role:"img",focusable:"false",viewBox:"0 -833.2 1008.6 844.2","aria-hidden":"true"},s2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.179ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -694 521 705","aria-hidden":"true"},o2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},n2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.448ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 640 453","aria-hidden":"true"},d2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.333ex"},xmlns:"http://www.w3.org/2000/svg",width:"42.174ex",height:"3.232ex",role:"img",focusable:"false",viewBox:"0 -839.4 18641 1428.6","aria-hidden":"true"},i2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},h2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.818ex"},xmlns:"http://www.w3.org/2000/svg",width:"28.325ex",height:"6.755ex",role:"img",focusable:"false",viewBox:"0 -1740.2 12519.5 2985.6","aria-hidden":"true"},p2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.97ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.65ex",height:"2.869ex",role:"img",focusable:"false",viewBox:"0 -839.4 2497.5 1268.1","aria-hidden":"true"},H2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},u2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.819ex"},xmlns:"http://www.w3.org/2000/svg",width:"37.854ex",height:"6.757ex",role:"img",focusable:"false",viewBox:"0 -1740.7 16731.4 2986.6","aria-hidden":"true"},c2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},w2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.06ex"},xmlns:"http://www.w3.org/2000/svg",width:"76.065ex",height:"6.999ex",role:"img",focusable:"false",viewBox:"0 -1740.7 33620.8 3093.4","aria-hidden":"true"},x2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},L2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.504ex"},xmlns:"http://www.w3.org/2000/svg",width:"31.611ex",height:"5.456ex",role:"img",focusable:"false",viewBox:"0 -1304.6 13972.2 2411.5","aria-hidden":"true"},f2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},y2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.302ex",height:"2.009ex",role:"img",focusable:"false",viewBox:"0 -683 6763.5 888","aria-hidden":"true"},M2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"2.378ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 1051 683","aria-hidden":"true"},V2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Z2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.978ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 1316.2 647","aria-hidden":"true"},b2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},v2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-3.243ex"},xmlns:"http://www.w3.org/2000/svg",width:"49.56ex",height:"7.618ex",role:"img",focusable:"false",viewBox:"0 -1933.5 21905.5 3367","aria-hidden":"true"},D2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.719ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -705 760 727","aria-hidden":"true"},C2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},O2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.873ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 828 683","aria-hidden":"true"},R2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.621ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 1158.5 647","aria-hidden":"true"},A2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.576ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.672ex",height:"2.498ex",role:"img",focusable:"false",viewBox:"0 -849.5 6927 1104.3","aria-hidden":"true"},X2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.554ex",height:"1.464ex",role:"img",focusable:"false",viewBox:"0 -442 1128.8 647","aria-hidden":"true"},z2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.239ex",height:"1.902ex",role:"img",focusable:"false",viewBox:"0 -683 1431.5 840.8","aria-hidden":"true"},G2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},J2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.8ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.709ex",height:"2.495ex",role:"img",focusable:"false",viewBox:"0 -749.5 4291.3 1103","aria-hidden":"true"},E2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},P2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.05ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.371ex",height:"1.595ex",role:"img",focusable:"false",viewBox:"0 -683 1048 705","aria-hidden":"true"},q2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.564ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.885ex",height:"2.26ex",role:"img",focusable:"false",viewBox:"0 -749.5 1717.4 999","aria-hidden":"true"},W2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},K2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.695ex",height:"1.538ex",role:"img",focusable:"false",viewBox:"0 -680 749 680","aria-hidden":"true"},U2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},$2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"2.378ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 1051 683","aria-hidden":"true"},Y2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},_2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"35.489ex",height:"4.676ex",role:"img",focusable:"false",viewBox:"0 -1370 15686 2067","aria-hidden":"true"},Q4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},t4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.576ex"},xmlns:"http://www.w3.org/2000/svg",width:"29.728ex",height:"2.498ex",role:"img",focusable:"false",viewBox:"0 -849.5 13139.6 1104.3","aria-hidden":"true"},a4={class:"tip custom-block"},T4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.991ex",height:"3.006ex",role:"img",focusable:"false",viewBox:"0 -975.7 1763.8 1328.5","aria-hidden":"true"},l4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},s4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"31.943ex",height:"3.006ex",role:"img",focusable:"false",viewBox:"0 -975.7 14118.6 1328.5","aria-hidden":"true"},m4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.701ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -716 1194 727","aria-hidden":"true"},n4={class:"tip custom-block"},d4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.541ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 681 683","aria-hidden":"true"},i4={class:"tip custom-block"},h4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.247ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 993.3 636","aria-hidden":"true"},g4={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},H4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"41.494ex",height:"4.676ex",role:"img",focusable:"false",viewBox:"0 -1370 18340.4 2067","aria-hidden":"true"},u4={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},c4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"53.126ex",height:"4.676ex",role:"img",focusable:"false",viewBox:"0 -1370 23481.8 2067","aria-hidden":"true"},w4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.966ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 7057.1 1083.9","aria-hidden":"true"},L4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"3.773ex",height:"1.887ex",role:"img",focusable:"false",viewBox:"0 -833.9 1667.7 833.9","aria-hidden":"true"},y4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.781ex"},xmlns:"http://www.w3.org/2000/svg",width:"26.759ex",height:"2.97ex",role:"img",focusable:"false",viewBox:"0 -967.8 11827.4 1312.8","aria-hidden":"true"},k4={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},V4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"18.127ex",height:"2.185ex",role:"img",focusable:"false",viewBox:"0 -883.9 8012.2 965.9","aria-hidden":"true"},Z4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.957ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 4843 1083.9","aria-hidden":"true"},v4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"18.264ex",height:"2.32ex",role:"img",focusable:"false",viewBox:"0 -775.2 8072.7 1025.2","aria-hidden":"true"},j4={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"18.264ex",height:"2.32ex",role:"img",focusable:"false",viewBox:"0 -775.2 8072.7 1025.2","aria-hidden":"true"},O4={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},R4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"24.286ex",height:"2.36ex",role:"img",focusable:"false",viewBox:"0 -961.2 10734.5 1043.2","aria-hidden":"true"},F4={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},A4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-8.999ex"},xmlns:"http://www.w3.org/2000/svg",width:"49.753ex",height:"19.129ex",role:"img",focusable:"false",viewBox:"0 -4477.6 21990.6 8455.2","aria-hidden":"true"},B4={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},X4={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-8.191ex"},xmlns:"http://www.w3.org/2000/svg",width:"60.665ex",height:"17.514ex",role:"img",focusable:"false",viewBox:"0 -4120.6 26813.9 7741.1","aria-hidden":"true"};function S4(z4,t,I4,G4,J4,E4){return e(),T("div",null,[t[384]||(t[384]=Q("h1",{id:"Spatial-discretization",tabindex:"-1"},[a("Spatial discretization "),Q("a",{class:"header-anchor",href:"#Spatial-discretization","aria-label":'Permalink to "Spatial discretization {#Spatial-discretization}"'},"")],-1)),Q("p",null,[t[36]||(t[36]=a("the ")),Q("mjx-container",n,[(e(),T("svg",d,t[0]||(t[0]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D451",d:"M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z",style:{"stroke-width":"3"}})])])],-1)]))),t[1]||(t[1]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"d")])],-1))]),t[37]||(t[37]=a(" spatial dimensions are indexed by ")),Q("mjx-container",r,[(e(),T("svg",i,t[2]||(t[2]=[l(' ',1)]))),t[3]||(t[3]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α"),Q("mo",null,"∈"),Q("mo",{fence:"false",stretchy:"false"},"{"),Q("mn",null,"1"),Q("mo",null,","),Q("mo",null,"…"),Q("mo",null,","),Q("mi",null,"d"),Q("mo",{fence:"false",stretchy:"false"},"}")])],-1))]),t[38]||(t[38]=a(". The ")),Q("mjx-container",h,[(e(),T("svg",p,t[4]||(t[4]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D6FC",d:"M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z",style:{"stroke-width":"3"}})])])],-1)]))),t[5]||(t[5]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α")])],-1))]),t[39]||(t[39]=a("-th unit vector is denoted ")),Q("mjx-container",g,[(e(),T("svg",H,t[6]||(t[6]=[l(' ',1)]))),t[7]||(t[7]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"e"),Q("mi",null,"α")]),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"e"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mi",null,"β")])]),Q("msubsup",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"β"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")])])],-1))]),t[40]||(t[40]=a(", where the Kronecker symbol ")),Q("mjx-container",u,[(e(),T("svg",c,t[8]||(t[8]=[l(' ',1)]))),t[9]||(t[9]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"e"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mi",null,"β")])])])],-1))]),t[41]||(t[41]=a(" is ")),Q("mjx-container",w,[(e(),T("svg",x,t[10]||(t[10]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mn"},[Q("path",{"data-c":"31",d:"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z",style:{"stroke-width":"3"}})])])],-1)]))),t[11]||(t[11]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mn",null,"1")])],-1))]),t[42]||(t[42]=a(" if ")),Q("mjx-container",L,[(e(),T("svg",f,t[12]||(t[12]=[l(' ',1)]))),t[13]||(t[13]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mi",null,"β")])],-1))]),t[43]||(t[43]=a(" and ")),Q("mjx-container",y,[(e(),T("svg",M,t[14]||(t[14]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mn"},[Q("path",{"data-c":"30",d:"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z",style:{"stroke-width":"3"}})])])],-1)]))),t[15]||(t[15]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mn",null,"0")])],-1))]),t[44]||(t[44]=a(" otherwise. We note ")),Q("mjx-container",k,[(e(),T("svg",V,t[16]||(t[16]=[l(' ',1)]))),t[17]||(t[17]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")]),Q("mo",null,"="),Q("msub",null,[Q("mi",null,"e"),Q("mi",null,"α")]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")])],-1))]),t[45]||(t[45]=a(". The Cartesian index ")),Q("mjx-container",Z,[(e(),T("svg",b,t[18]||(t[18]=[l(' ',1)]))),t[19]||(t[19]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,","),Q("mo",null,"…"),Q("mo",null,","),Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},")")])],-1))]),t[46]||(t[46]=a(" is used to avoid repeating terms and equations ")),Q("mjx-container",v,[(e(),T("svg",D,t[20]||(t[20]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D451",d:"M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z",style:{"stroke-width":"3"}})])])],-1)]))),t[21]||(t[21]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"d")])],-1))]),t[47]||(t[47]=a(" times, where ")),Q("mjx-container",j,[(e(),T("svg",C,t[22]||(t[22]=[l(' ',1)]))),t[23]||(t[23]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")])])],-1))]),t[48]||(t[48]=a(" is a scalar index (typically one of ")),Q("mjx-container",O,[(e(),T("svg",R,t[24]||(t[24]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D456",d:"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),t[25]||(t[25]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"i")])],-1))]),t[49]||(t[49]=a(", ")),Q("mjx-container",F,[(e(),T("svg",A,t[26]||(t[26]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D457",d:"M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z",style:{"stroke-width":"3"}})])])],-1)]))),t[27]||(t[27]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"j")])],-1))]),t[50]||(t[50]=a(", and ")),Q("mjx-container",B,[(e(),T("svg",X,t[28]||(t[28]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1)]))),t[29]||(t[29]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"k")])],-1))]),t[51]||(t[51]=a(" in common notation). This notation is dimension-agnostic, since we can write ")),Q("mjx-container",S,[(e(),T("svg",z,t[30]||(t[30]=[l(' ',1)]))),t[31]||(t[31]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"I")])])],-1))]),t[52]||(t[52]=a(" instead of ")),Q("mjx-container",I,[(e(),T("svg",G,t[32]||(t[32]=[l(' ',1)]))),t[33]||(t[33]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mi",null,"j")])])])],-1))]),t[53]||(t[53]=a(" in 2D or ")),Q("mjx-container",J,[(e(),T("svg",E,t[34]||(t[34]=[l(' ',1)]))),t[35]||(t[35]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mi",null,"j"),Q("mi",null,"k")])])])],-1))]),t[54]||(t[54]=a(" in 3D. In our Julia implementation of the solver we use the same Cartesian notation (")),t[55]||(t[55]=Q("code",null,"u[I]",-1)),t[56]||(t[56]=a(" instead of ")),t[57]||(t[57]=Q("code",null,"u[i, j]",-1)),t[58]||(t[58]=a(" or ")),t[59]||(t[59]=Q("code",null,"u[i, j, k]",-1)),t[60]||(t[60]=a(")."))]),Q("p",null,[t[91]||(t[91]=a("For the discretization scheme, we use a staggered Cartesian grid as proposed by Harlow and Welch [")),t[92]||(t[92]=Q("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Harlow1965"},"13",-1)),t[93]||(t[93]=a("]. Consider a rectangular domain ")),Q("mjx-container",P,[(e(),T("svg",q,t[61]||(t[61]=[l(' ',1)]))),t[62]||(t[62]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",{mathvariant:"normal"},"Ω"),Q("mo",null,"="),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∏"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"["),Q("msub",null,[Q("mi",null,"a"),Q("mi",null,"α")]),Q("mo",null,","),Q("msub",null,[Q("mi",null,"b"),Q("mi",null,"α")]),Q("mo",{stretchy:"false"},"]")])],-1))]),t[94]||(t[94]=a(", where ")),Q("mjx-container",N,[(e(),T("svg",W,t[63]||(t[63]=[l(' ',1)]))),t[64]||(t[64]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"a"),Q("mi",null,"α")]),Q("mo",null,"<"),Q("msub",null,[Q("mi",null,"b"),Q("mi",null,"α")])])],-1))]),t[95]||(t[95]=a(" are the domain boundaries and ")),Q("mjx-container",K,[(e(),T("svg",U,t[65]||(t[65]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mo"},[Q("path",{"data-c":"220F",d:"M158 656Q147 684 131 694Q110 707 69 710H55V750H888V710H874Q840 708 820 698T795 678T786 656V-155Q798 -206 874 -210H888V-250H570V-210H584Q618 -208 638 -197T663 -178T673 -155V710H270V277L271 -155Q283 -206 359 -210H373V-250H55V-210H69Q103 -208 123 -197T148 -178T158 -155V656Z",style:{"stroke-width":"3"}})])])],-1)]))),t[66]||(t[66]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{"data-mjx-texclass":"OP"},"∏")])],-1))]),t[96]||(t[96]=a(" is a Cartesian product. Let ")),Q("mjx-container",$,[(e(),T("svg",Y,t[67]||(t[67]=[l(' ',1)]))),t[68]||(t[68]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",{mathvariant:"normal"},"Ω"),Q("mo",null,"="),Q("munder",null,[Q("mo",{"data-mjx-texclass":"OP"},"⋃"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")])])]),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")])])],-1))]),t[97]||(t[97]=a(" be a partitioning of ")),Q("mjx-container",_,[(e(),T("svg",Q1,t[69]||(t[69]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"3A9",d:"M55 454Q55 503 75 546T127 617T197 665T272 695T337 704H352Q396 704 404 703Q527 687 596 615T666 454Q666 392 635 330T559 200T499 83V80H543Q589 81 600 83T617 93Q622 102 629 135T636 172L637 177H677V175L660 89Q645 3 644 2V0H552H488Q461 0 456 3T451 20Q451 89 499 235T548 455Q548 512 530 555T483 622T424 656T361 668Q332 668 303 658T243 626T193 560T174 456Q174 380 222 233T270 20Q270 7 263 0H77V2Q76 3 61 89L44 175V177H84L85 172Q85 171 88 155T96 119T104 93Q109 86 120 84T178 80H222V83Q206 132 162 199T87 329T55 454Z",style:{"stroke-width":"3"}})])])],-1)]))),t[70]||(t[70]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",{mathvariant:"normal"},"Ω")])],-1))]),t[98]||(t[98]=a(", where ")),Q("mjx-container",t1,[(e(),T("svg",a1,t[71]||(t[71]=[l(' ',1)]))),t[72]||(t[72]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")]),Q("mo",null,"="),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∏"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{fence:"false",stretchy:"false"},"{"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")]),Q("mo",null,","),Q("mn",null,"2"),Q("mo",null,"−"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")]),Q("mo",null,","),Q("mo",null,"…"),Q("mo",null,","),Q("msub",null,[Q("mi",null,"N"),Q("mi",null,"α")]),Q("mo",null,"−"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")]),Q("mo",{fence:"false",stretchy:"false"},"}")])],-1))]),t[99]||(t[99]=a(" are volume center indices, ")),Q("mjx-container",T1,[(e(),T("svg",e1,t[73]||(t[73]=[l(' ',1)]))),t[74]||(t[74]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"N"),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"N"),Q("mn",null,"1")]),Q("mo",null,","),Q("mo",null,"…"),Q("mo",null,","),Q("msub",null,[Q("mi",null,"N"),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"∈"),Q("msup",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"double-struck"},"N")]),Q("mi",null,"d")])])],-1))]),t[100]||(t[100]=a(" are the number of volumes in each dimension, ")),Q("mjx-container",l1,[(e(),T("svg",s1,t[75]||(t[75]=[l(' ',1)]))),t[76]||(t[76]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")]),Q("mo",null,"="),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∏"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")])]),Q("mi",null,"α")])])],-1))]),t[101]||(t[101]=a(" is a finite volume, ")),Q("mjx-container",m1,[(e(),T("svg",o1,t[77]||(t[77]=[l(' ',1)]))),t[78]||(t[78]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mi",null,"I"),Q("mi",null,"α")]),Q("mo",null,"="),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])]),Q("mo",null,"∩"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])]),Q("mo",null,"="),Q("munder",null,[Q("mo",{"data-mjx-texclass":"OP"},"∏"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"β"),Q("mo",null,"≠"),Q("mi",null,"α")])]),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"β")])]),Q("mi",null,"β")])])],-1))]),t[102]||(t[102]=a(" is a volume face, ")),Q("mjx-container",n1,[(e(),T("svg",d1,t[79]||(t[79]=[l(' ',1)]))),t[80]||(t[80]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mi",null,"i"),Q("mi",null,"α")]),Q("mo",null,"="),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"["),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"−"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")])]),Q("mi",null,"α")]),Q("mo",null,","),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"+"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")])]),Q("mi",null,"α")]),Q("mo",{"data-mjx-texclass":"CLOSE"},"]")])])],-1))]),t[103]||(t[103]=a(" is a volume edge, ")),Q("mjx-container",r1,[(e(),T("svg",i1,t[81]||(t[81]=[l(' ',1)]))),t[82]||(t[82]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",null,"x"),Q("mn",null,"0"),Q("mi",null,"α")]),Q("mo",null,","),Q("mo",null,"…"),Q("mo",null,","),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"N"),Q("mi",null,"α")])]),Q("mi",null,"α")])])],-1))]),t[104]||(t[104]=a(" are volume boundary coordinates, and ")),Q("mjx-container",h1,[(e(),T("svg",p1,t[83]||(t[83]=[l(' ',1)]))),t[84]||(t[84]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",null,"x"),Q("mi",null,"i"),Q("mi",null,"α")]),Q("mo",null,"="),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")]),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"("),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"−"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")])]),Q("mi",null,"α")]),Q("mo",null,"+"),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"i"),Q("mo",null,"+"),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")])]),Q("mi",null,"α")]),Q("mo",{"data-mjx-texclass":"CLOSE"},")")])])],-1))]),t[105]||(t[105]=a(" for ")),Q("mjx-container",g1,[(e(),T("svg",H1,t[85]||(t[85]=[l(' ',1)]))),t[86]||(t[86]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"i"),Q("mo",null,"∈"),Q("mo",{fence:"false",stretchy:"false"},"{"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2"),Q("mo",null,","),Q("mo",null,"…"),Q("mo",null,","),Q("msub",null,[Q("mi",null,"N"),Q("mi",null,"α")]),Q("mo",null,"−"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2"),Q("mo",{fence:"false",stretchy:"false"},"}")])],-1))]),t[106]||(t[106]=a(" are volume center coordinates. We also define the operator ")),Q("mjx-container",u1,[(e(),T("svg",c1,t[87]||(t[87]=[l(' ',1)]))),t[88]||(t[88]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"α")])])],-1))]),t[107]||(t[107]=a(" which maps a discrete scalar field ")),Q("mjx-container",w1,[(e(),T("svg",x1,t[89]||(t[89]=[l(' ',1)]))),t[90]||(t[90]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"φ"),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"φ"),Q("mi",null,"I")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"I")])])],-1))]),t[108]||(t[108]=a(" to"))]),Q("mjx-container",L1,[(e(),T("svg",f1,t[109]||(t[109]=[l(' ',1)]))),t[110]||(t[110]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"α")]),Q("mi",null,"φ"),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"I")]),Q("mo",null,"="),Q("mfrac",null,[Q("mrow",null,[Q("msub",null,[Q("mi",null,"φ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"φ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])])]),Q("mrow",null,[Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")])]),Q("mi",null,"α")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])]),Q("mo",null,".")])],-1))]),Q("p",null,[t[119]||(t[119]=a("It can be interpreted as a discrete equivalent of the continuous operator ")),Q("mjx-container",y1,[(e(),T("svg",M1,t[111]||(t[111]=[l(' ',1)]))),t[112]||(t[112]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mfrac",null,[Q("mi",null,"∂"),Q("mrow",null,[Q("mi",null,"∂"),Q("msup",null,[Q("mi",null,"x"),Q("mi",null,"α")])])])])],-1))]),t[120]||(t[120]=a(". All the above definitions are extended to be valid in volume centers ")),Q("mjx-container",k1,[(e(),T("svg",V1,t[113]||(t[113]=[l(' ',1)]))),t[114]||(t[114]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")])])],-1))]),t[121]||(t[121]=a(", volume faces ")),Q("mjx-container",Z1,[(e(),T("svg",b1,t[115]||(t[115]=[l(' ',1)]))),t[116]||(t[116]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])],-1))]),t[122]||(t[122]=a(", or volume corners ")),Q("mjx-container",v1,[(e(),T("svg",D1,t[117]||(t[117]=[l(' ',1)]))),t[118]||(t[118]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")]),Q("mo",null,"+"),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])],-1))]),t[123]||(t[123]=a(". The discretization is illustrated below:"))]),t[385]||(t[385]=Q("p",null,[Q("img",{src:m,alt:""})],-1)),t[386]||(t[386]=Q("h2",{id:"Finite-volume-discretization-of-the-Navier-Stokes-equations",tabindex:"-1"},[a("Finite volume discretization of the Navier-Stokes equations "),Q("a",{class:"header-anchor",href:"#Finite-volume-discretization-of-the-Navier-Stokes-equations","aria-label":'Permalink to "Finite volume discretization of the Navier-Stokes equations {#Finite-volume-discretization-of-the-Navier-Stokes-equations}"'},"")],-1)),Q("p",null,[t[150]||(t[150]=a("We now define the unknown degrees of freedom. The average pressure in ")),Q("mjx-container",j1,[(e(),T("svg",C1,t[124]||(t[124]=[l(' ',1)]))),t[125]||(t[125]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")])])],-1))]),t[151]||(t[151]=a(", ")),Q("mjx-container",O1,[(e(),T("svg",R1,t[126]||(t[126]=[l(' ',1)]))),t[127]||(t[127]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")])])],-1))]),t[152]||(t[152]=a(" is approximated by the quantity ")),Q("mjx-container",F1,[(e(),T("svg",A1,t[128]||(t[128]=[l(' ',1)]))),t[129]||(t[129]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"p"),Q("mi",null,"I")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"t"),Q("mo",{stretchy:"false"},")")])],-1))]),t[153]||(t[153]=a(". The average ")),Q("mjx-container",B1,[(e(),T("svg",X1,t[130]||(t[130]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D6FC",d:"M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z",style:{"stroke-width":"3"}})])])],-1)]))),t[131]||(t[131]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α")])],-1))]),t[154]||(t[154]=a("-velocity on the face ")),Q("mjx-container",S1,[(e(),T("svg",z1,t[132]||(t[132]=[l(' ',1)]))),t[133]||(t[133]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mi",null,"I"),Q("mi",null,"α")])])],-1))]),t[155]||(t[155]=a(", ")),Q("mjx-container",I1,[(e(),T("svg",G1,t[134]||(t[134]=[l(' ',1)]))),t[135]||(t[135]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])],-1))]),t[156]||(t[156]=a(" is approximated by the quantity ")),Q("mjx-container",J1,[(e(),T("svg",E1,t[136]||(t[136]=[l(' ',1)]))),t[137]||(t[137]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",null,"u"),Q("mi",null,"I"),Q("mi",null,"α")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"t"),Q("mo",{stretchy:"false"},")")])],-1))]),t[157]||(t[157]=a(". Note how the pressure ")),Q("mjx-container",P1,[(e(),T("svg",q1,t[138]||(t[138]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D45D",d:"M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z",style:{"stroke-width":"3"}})])])],-1)]))),t[139]||(t[139]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"p")])],-1))]),t[158]||(t[158]=a(" and the ")),Q("mjx-container",N1,[(e(),T("svg",W1,t[140]||(t[140]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D451",d:"M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z",style:{"stroke-width":"3"}})])])],-1)]))),t[141]||(t[141]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"d")])],-1))]),t[159]||(t[159]=a(" velocity fields ")),Q("mjx-container",K1,[(e(),T("svg",U1,t[142]||(t[142]=[l(' ',1)]))),t[143]||(t[143]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")])])],-1))]),t[160]||(t[160]=a(" are each defined in their own canonical positions ")),Q("mjx-container",$1,[(e(),T("svg",Y1,t[144]||(t[144]=[l(' ',1)]))),t[145]||(t[145]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"x"),Q("mi",null,"I")])])],-1))]),t[161]||(t[161]=a(" and ")),Q("mjx-container",_1,[(e(),T("svg",Q3,t[146]||(t[146]=[l(' ',1)]))),t[147]||(t[147]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])])])],-1))]),t[162]||(t[162]=a(" for ")),Q("mjx-container",t3,[(e(),T("svg",a3,t[148]||(t[148]=[l(' ',1)]))),t[149]||(t[149]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")])])],-1))]),t[163]||(t[163]=a(". In the following, we derive equations for these unknowns."))]),Q("p",null,[t[170]||(t[170]=a("Using the pressure control volume ")),Q("mjx-container",T3,[(e(),T("svg",e3,t[164]||(t[164]=[l(' ',1)]))),t[165]||(t[165]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),Q("mo",null,"="),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")])])],-1))]),t[171]||(t[171]=a(" with ")),Q("mjx-container",l3,[(e(),T("svg",s3,t[166]||(t[166]=[l(' ',1)]))),t[167]||(t[167]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")])])],-1))]),t[172]||(t[172]=a(" in the mass integral constraint and approximating the face integrals with the mid-point quadrature rule ")),Q("mjx-container",m3,[(e(),T("svg",o3,t[168]||(t[168]=[l(' ',1)]))),t[169]||(t[169]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mi",null,"I")])])]),Q("mi",null,"u"),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Γ"),Q("mo",null,"≈"),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mi",null,"I")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"I")])])],-1))]),t[173]||(t[173]=a(" results in the discrete divergence-free constraint"))]),Q("mjx-container",n3,[(e(),T("svg",d3,t[174]||(t[174]=[l(' ',1)]))),t[175]||(t[175]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"α")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"I")]),Q("mo",null,"="),Q("mn",null,"0.")])],-1))]),Q("p",null,[t[178]||(t[178]=a("Note how dividing by the volume size results in a discrete equation resembling the continuous one (since ")),Q("mjx-container",r3,[(e(),T("svg",i3,t[176]||(t[176]=[l(' ',1)]))),t[177]||(t[177]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("mo",null,"="),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mi",null,"I"),Q("mi",null,"α")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")])]),Q("mi",null,"α")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),t[179]||(t[179]=a(")."))]),Q("p",null,[t[186]||(t[186]=a("Similarly, choosing an ")),Q("mjx-container",h3,[(e(),T("svg",p3,t[180]||(t[180]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D6FC",d:"M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z",style:{"stroke-width":"3"}})])])],-1)]))),t[181]||(t[181]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α")])],-1))]),t[187]||(t[187]=a("-velocity control volume ")),Q("mjx-container",g3,[(e(),T("svg",H3,t[182]||(t[182]=[l(' ',1)]))),t[183]||(t[183]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),Q("mo",null,"="),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])])])],-1))]),t[188]||(t[188]=a(" with ")),Q("mjx-container",u3,[(e(),T("svg",c3,t[184]||(t[184]=[l(' ',1)]))),t[185]||(t[185]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"∈"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"I")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])],-1))]),t[189]||(t[189]=a(" in the integral momentum equation, approximating the volume- and face integrals using the mid-point quadrature rule, and replacing remaining spatial derivatives in the diffusive term with a finite difference approximation gives the discrete momentum equations"))]),Q("mjx-container",w3,[(e(),T("svg",x3,t[190]||(t[190]=[l(' ',1)]))),t[191]||(t[191]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mfrac",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")]),Q("mi",null,"α")]),Q("mo",null,"="),Q("mo",null,"−"),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"β"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("mo",{stretchy:"false"},"("),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"β")]),Q("mo",{stretchy:"false"},")"),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",null,"+"),Q("mi",null,"ν"),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"β"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",null,"+"),Q("msup",null,[Q("mi",null,"f"),Q("mi",null,"α")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"α")]),Q("mi",null,"p"),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",null,".")])],-1))]),Q("p",null,[t[220]||(t[220]=a("where we made the assumption that ")),Q("mjx-container",L3,[(e(),T("svg",f3,t[192]||(t[192]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D453",d:"M118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162Z",style:{"stroke-width":"3"}})])])],-1)]))),t[193]||(t[193]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"f")])],-1))]),t[221]||(t[221]=a(" is constant in time for simplicity. The outer discrete derivative in ")),Q("mjx-container",y3,[(e(),T("svg",M3,t[194]||(t[194]=[l(' ',1)]))),t[195]||(t[195]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])])])],-1))]),t[222]||(t[222]=a(" is required at the position ")),Q("mjx-container",k3,[(e(),T("svg",V3,t[196]||(t[196]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D43C",d:"M43 1Q26 1 26 10Q26 12 29 24Q34 43 39 45Q42 46 54 46H60Q120 46 136 53Q137 53 138 54Q143 56 149 77T198 273Q210 318 216 344Q286 624 286 626Q284 630 284 631Q274 637 213 637H193Q184 643 189 662Q193 677 195 680T209 683H213Q285 681 359 681Q481 681 487 683H497Q504 676 504 672T501 655T494 639Q491 637 471 637Q440 637 407 634Q393 631 388 623Q381 609 337 432Q326 385 315 341Q245 65 245 59Q245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2Q143 2 113 2T65 2T43 1Z",style:{"stroke-width":"3"}})])])],-1)]))),t[197]||(t[197]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I")])],-1))]),t[223]||(t[223]=a(", which means that the inner derivative is evaluated as ")),Q("mjx-container",Z3,[(e(),T("svg",b3,t[198]||(t[198]=[l(' ',1)]))),t[199]||(t[199]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"β")])])])])],-1))]),t[224]||(t[224]=a(" and ")),Q("mjx-container",v3,[(e(),T("svg",D3,t[200]||(t[200]=[l(' ',1)]))),t[201]||(t[201]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"β")])])])])],-1))]),t[225]||(t[225]=a(", thus requiring ")),Q("mjx-container",j3,[(e(),T("svg",C3,t[202]||(t[202]=[l(' ',1)]))),t[203]||(t[203]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("mn",null,"2"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"β")])]),Q("mi",null,"α")])])],-1))]),t[226]||(t[226]=a(", ")),Q("mjx-container",O3,[(e(),T("svg",R3,t[204]||(t[204]=[l(' ',1)]))),t[205]||(t[205]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")]),Q("mi",null,"α")])])],-1))]),t[227]||(t[227]=a(", and ")),Q("mjx-container",F3,[(e(),T("svg",A3,t[206]||(t[206]=[l(' ',1)]))),t[207]||(t[207]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("mn",null,"2"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"β")])]),Q("mi",null,"α")])])],-1))]),t[228]||(t[228]=a(", which are all in their canonical positions. The two velocity components in the convective term ")),Q("mjx-container",B3,[(e(),T("svg",X3,t[208]||(t[208]=[l(' ',1)]))),t[209]||(t[209]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"β")])])],-1))]),t[229]||(t[229]=a(" are required at the positions ")),Q("mjx-container",S3,[(e(),T("svg",z3,t[210]||(t[210]=[l(' ',1)]))),t[211]||(t[211]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"β")])])],-1))]),t[230]||(t[230]=a(" and ")),Q("mjx-container",I3,[(e(),T("svg",G3,t[212]||(t[212]=[l(' ',1)]))),t[213]||(t[213]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"β")])])],-1))]),t[231]||(t[231]=a(", which are outside the canonical positions. Their value at the required position is obtained using averaging with weights ")),Q("mjx-container",J3,[(e(),T("svg",E3,t[214]||(t[214]=[l(' ',1)]))),t[215]||(t[215]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")])],-1))]),t[232]||(t[232]=a(" for the ")),Q("mjx-container",P3,[(e(),T("svg",q3,t[216]||(t[216]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D6FC",d:"M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z",style:{"stroke-width":"3"}})])])],-1)]))),t[217]||(t[217]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α")])],-1))]),t[233]||(t[233]=a("-component and with linear interpolation for the ")),Q("mjx-container",N3,[(e(),T("svg",W3,t[218]||(t[218]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D6FD",d:"M29 -194Q23 -188 23 -186Q23 -183 102 134T186 465Q208 533 243 584T309 658Q365 705 429 705H431Q493 705 533 667T573 570Q573 465 469 396L482 383Q533 332 533 252Q533 139 448 65T257 -10Q227 -10 203 -2T165 17T143 40T131 59T126 65L62 -188Q60 -194 42 -194H29ZM353 431Q392 431 427 419L432 422Q436 426 439 429T449 439T461 453T472 471T484 495T493 524T501 560Q503 569 503 593Q503 611 502 616Q487 667 426 667Q384 667 347 643T286 582T247 514T224 455Q219 439 186 308T152 168Q151 163 151 147Q151 99 173 68Q204 26 260 26Q302 26 349 51T425 137Q441 171 449 214T457 279Q457 337 422 372Q380 358 347 358H337Q258 358 258 389Q258 396 261 403Q275 431 353 431Z",style:{"stroke-width":"3"}})])])],-1)]))),t[219]||(t[219]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"β")])],-1))]),t[234]||(t[234]=a("-component. This preserves the skew-symmetry of the convection operator, such that energy is conserved (in the convective term) [")),t[235]||(t[235]=Q("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Verstappen2003"},"14",-1)),t[236]||(t[236]=a("]."))]),t[387]||(t[387]=Q("h2",{id:"Boundary-conditions",tabindex:"-1"},[a("Boundary conditions "),Q("a",{class:"header-anchor",href:"#Boundary-conditions","aria-label":'Permalink to "Boundary conditions {#Boundary-conditions}"'},"")],-1)),Q("div",K3,[t[262]||(t[262]=Q("p",{class:"custom-block-title"},"Storage convention",-1)),Q("p",null,[t[253]||(t[253]=a("We use the column-major convention (Julia, MATLAB, Fortran), and not the row-major convention (Python, C). Thus the ")),Q("mjx-container",U3,[(e(),T("svg",$3,t[237]||(t[237]=[l(' ',1)]))),t[238]||(t[238]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"1")])])],-1))]),t[254]||(t[254]=a("-index ")),Q("mjx-container",Y3,[(e(),T("svg",_3,t[239]||(t[239]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D456",d:"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),t[240]||(t[240]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"i")])],-1))]),t[255]||(t[255]=a(" will vary for one whole cycle in the vectors before the ")),Q("mjx-container",Q2,[(e(),T("svg",t2,t[241]||(t[241]=[l(' ',1)]))),t[242]||(t[242]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"2")])])],-1))]),t[256]||(t[256]=a("-index ")),Q("mjx-container",a2,[(e(),T("svg",T2,t[243]||(t[243]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D457",d:"M297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376Z",style:{"stroke-width":"3"}})])])],-1)]))),t[244]||(t[244]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"j")])],-1))]),t[257]||(t[257]=a(", ")),Q("mjx-container",e2,[(e(),T("svg",l2,t[245]||(t[245]=[l(' ',1)]))),t[246]||(t[246]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"3")])])],-1))]),t[258]||(t[258]=a(" index ")),Q("mjx-container",s2,[(e(),T("svg",m2,t[247]||(t[247]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D458",d:"M121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647Z",style:{"stroke-width":"3"}})])])],-1)]))),t[248]||(t[248]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"k")])],-1))]),t[259]||(t[259]=a(", and component-index ")),Q("mjx-container",o2,[(e(),T("svg",n2,t[249]||(t[249]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D6FC",d:"M34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26Z",style:{"stroke-width":"3"}})])])],-1)]))),t[250]||(t[250]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"α")])],-1))]),t[260]||(t[260]=a(" are incremented, e.g. ")),Q("mjx-container",d2,[(e(),T("svg",r2,t[251]||(t[251]=[l(' ',1)]))),t[252]||(t[252]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",{stretchy:"false"},"("),Q("mn",null,"1"),Q("mo",null,","),Q("mn",null,"1"),Q("mo",null,","),Q("mn",null,"1"),Q("mo",{stretchy:"false"},")")]),Q("mn",null,"1")]),Q("mo",null,","),Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",{stretchy:"false"},"("),Q("mn",null,"2"),Q("mo",null,","),Q("mn",null,"1"),Q("mo",null,","),Q("mn",null,"1"),Q("mo",{stretchy:"false"},")")]),Q("mn",null,"1")]),Q("mo",null,","),Q("mo",null,"…"),Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"N"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"u"),Q("mn",null,"3")])])]),Q("mo",{stretchy:"false"},"("),Q("mn",null,"1"),Q("mo",{stretchy:"false"},")"),Q("mo",null,","),Q("msub",null,[Q("mi",null,"N"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"u"),Q("mn",null,"3")])])]),Q("mo",{stretchy:"false"},"("),Q("mn",null,"2"),Q("mo",{stretchy:"false"},")"),Q("mo",null,","),Q("msub",null,[Q("mi",null,"N"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"u"),Q("mn",null,"3")])])]),Q("mo",{stretchy:"false"},"("),Q("mn",null,"3"),Q("mo",{stretchy:"false"},")"),Q("mo",{stretchy:"false"},")")]),Q("mn",null,"3")]),Q("mo",{stretchy:"false"},")")])],-1))]),t[261]||(t[261]=a(" in 3D."))])]),t[388]||(t[388]=Q("h2",{id:"Fourth-order-accurate-discretization",tabindex:"-1"},[a("Fourth order accurate discretization "),Q("a",{class:"header-anchor",href:"#Fourth-order-accurate-discretization","aria-label":'Permalink to "Fourth order accurate discretization {#Fourth-order-accurate-discretization}"'},"")],-1)),t[389]||(t[389]=Q("p",null,[a("The above discretization is second order accurate. A fourth order accurate discretization can be obtained by judiciously combining the second order discretization with itself on a grid with three times larger cells in each dimension ["),Q("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Verstappen2003"},"14"),a("] ["),Q("a",{href:"/IncompressibleNavierStokes.jl/previews/PR126/references#Sanderse2014"},"15"),a("]. The coarse discretization is identical, but the mass equation is derived for the three times coarser control volume")],-1)),Q("mjx-container",i2,[(e(),T("svg",h2,t[263]||(t[263]=[l(' ',1)]))),t[264]||(t[264]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I"),Q("mn",null,"3")]),Q("mo",null,"="),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"⋃"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"e"),Q("mi",null,"α")])])]),Q("mo",null,"∪"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")]),Q("mo",null,"∪"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"e"),Q("mi",null,"α")])])]),Q("mo",null,",")])],-1))]),Q("p",null,[t[267]||(t[267]=a("while the momentum equation is derived for its shifted variant ")),Q("mjx-container",p2,[(e(),T("svg",g2,t[265]||(t[265]=[l(' ',1)]))),t[266]||(t[266]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])]),Q("mn",null,"3")])])],-1))]),t[268]||(t[268]=a(". The resulting fourth order accurate equations are given by"))]),Q("mjx-container",H2,[(e(),T("svg",u2,t[269]||(t[269]=[l(' ',1)]))),t[270]||(t[270]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"α")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"I")]),Q("mo",null,"−"),Q("mfrac",null,[Q("mrow",null,[Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I"),Q("mn",null,"3")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")]),Q("mrow",null,[Q("msup",null,[Q("mn",null,"3"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mn",null,"2"),Q("mo",null,"+"),Q("mi",null,"d")])]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msubsup",null,[Q("mi",null,"δ"),Q("mi",null,"α"),Q("mn",null,"3")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"I")]),Q("mo",null,"="),Q("mn",null,"0")])],-1))]),t[390]||(t[390]=Q("p",null,"and",-1)),Q("mjx-container",c2,[(e(),T("svg",w2,t[271]||(t[271]=[l(' ',1)]))),t[272]||(t[272]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mfrac",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("msubsup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")]),Q("mi",null,"α")]),Q("mo",null,"="),Q("mo",null,"−"),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"β"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("mo",{stretchy:"false"},"("),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"β")]),Q("mo",{stretchy:"false"},")"),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",null,"+"),Q("mi",null,"ν"),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"β"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"β")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",null,"+"),Q("msup",null,[Q("mi",null,"f"),Q("mi",null,"α")]),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"δ"),Q("mi",null,"α")]),Q("mi",null,"p"),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I")])]),Q("mo",null,"+"),Q("mtext",null,"fourth order"),Q("mo",null,",")])],-1))]),t[391]||(t[391]=Q("p",null,"where",-1)),Q("mjx-container",x2,[(e(),T("svg",L2,t[273]||(t[273]=[l(' ',1)]))),t[274]||(t[274]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mo",{stretchy:"false"},"("),Q("msubsup",null,[Q("mi",null,"δ"),Q("mi",null,"α"),Q("mn",null,"3")]),Q("mi",null,"φ"),Q("msub",null,[Q("mo",{stretchy:"false"},")"),Q("mi",null,"I")]),Q("mo",null,"="),Q("mfrac",null,[Q("mrow",null,[Q("msub",null,[Q("mi",null,"φ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("mn",null,"3"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"φ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("mn",null,"3"),Q("msub",null,[Q("mi",null,"h"),Q("mi",null,"α")])])])]),Q("mrow",null,[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")]),Q("mo",null,"−"),Q("mn",null,"1")]),Q("mi",null,"α")]),Q("mo",null,"+"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")])]),Q("mi",null,"α")]),Q("mo",null,"+"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mi",null,"α")]),Q("mo",null,"+"),Q("mn",null,"1")]),Q("mi",null,"α")])])]),Q("mo",null,".")])],-1))]),t[392]||(t[392]=Q("h2",{id:"Matrix-representation",tabindex:"-1"},[a("Matrix representation "),Q("a",{class:"header-anchor",href:"#Matrix-representation","aria-label":'Permalink to "Matrix representation {#Matrix-representation}"'},"")],-1)),t[393]||(t[393]=Q("p",null,"We can write the mass and momentum equations in matrix form. We will use the same matrix notation for the second- and fourth order accurate discretizations. The discrete mass equation becomes",-1)),Q("mjx-container",f2,[(e(),T("svg",y2,t[275]||(t[275]=[l(' ',1)]))),t[276]||(t[276]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mi",null,"M"),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")]),Q("mo",null,"="),Q("mn",null,"0"),Q("mo",null,",")])],-1))]),Q("p",null,[t[281]||(t[281]=a("where ")),Q("mjx-container",M2,[(e(),T("svg",k2,t[277]||(t[277]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D440",d:"M289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629Z",style:{"stroke-width":"3"}})])])],-1)]))),t[278]||(t[278]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"M")])],-1))]),t[282]||(t[282]=a(" is the discrete divergence operator and ")),Q("mjx-container",V2,[(e(),T("svg",Z2,t[279]||(t[279]=[l(' ',1)]))),t[280]||(t[280]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")])])],-1))]),t[283]||(t[283]=a(" contains the boundary value contributions of the velocity to the divergence field."))]),t[394]||(t[394]=Q("p",null,"The discrete momentum equations become",-1)),Q("mjx-container",b2,[(e(),T("svg",v2,t[284]||(t[284]=[l(' ',1)]))),t[285]||(t[285]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd",null,[Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])])]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mo",null,"−"),Q("mi",null,"C"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"+"),Q("mi",null,"ν"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"D"),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"D")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"f"),Q("mi",null,"h")]),Q("mo",null,"−"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"G"),Q("msub",null,[Q("mi",null,"p"),Q("mi",null,"h")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"G")]),Q("mo",{stretchy:"false"},")")])]),Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("mi",null,"F"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"G"),Q("msub",null,[Q("mi",null,"p"),Q("mi",null,"h")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"G")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,",")])])])])],-1))]),Q("p",null,[t[306]||(t[306]=a("where ")),Q("mjx-container",D2,[(e(),T("svg",j2,t[286]||(t[286]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D436",d:"M50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q484 659 454 652T382 628T299 572T226 479Q194 422 175 346T156 222Q156 108 232 58Q280 24 350 24Q441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248Q648 243 647 239Q618 132 523 55T319 -22Q206 -22 128 53T50 252Z",style:{"stroke-width":"3"}})])])],-1)]))),t[287]||(t[287]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"C")])],-1))]),t[307]||(t[307]=a(" is she convection operator (including boundary contributions), ")),Q("mjx-container",C2,[(e(),T("svg",O2,t[288]||(t[288]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D437",d:"M287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469Z",style:{"stroke-width":"3"}})])])],-1)]))),t[289]||(t[289]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"D")])],-1))]),t[308]||(t[308]=a(" is the diffusion operator, ")),Q("mjx-container",R2,[(e(),T("svg",F2,t[290]||(t[290]=[l(' ',1)]))),t[291]||(t[291]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"D")])])],-1))]),t[309]||(t[309]=a(" is boundary contribution to the diffusion term, ")),Q("mjx-container",A2,[(e(),T("svg",B2,t[292]||(t[292]=[l(' ',1)]))),t[293]||(t[293]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"G"),Q("mo",null,"="),Q("msubsup",null,[Q("mi",null,"W"),Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("msup",null,[Q("mi",null,"M"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"sans-serif"},"T")])]),Q("mi",null,"W")])],-1))]),t[310]||(t[310]=a(" is the pressure gradient operator, ")),Q("mjx-container",X2,[(e(),T("svg",S2,t[294]||(t[294]=[l(' ',1)]))),t[295]||(t[295]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"G")])])],-1))]),t[311]||(t[311]=a(" contains the boundary contribution of the pressure to the pressure gradient (only non-zero for pressure boundary conditions), ")),Q("mjx-container",z2,[(e(),T("svg",I2,t[296]||(t[296]=[l(' ',1)]))),t[297]||(t[297]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"W"),Q("mi",null,"u")])])],-1))]),t[312]||(t[312]=a(" is a diagonal matrix containing the velocity volume sizes ")),Q("mjx-container",G2,[(e(),T("svg",J2,t[298]||(t[298]=[l(' ',1)]))),t[299]||(t[299]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("mi",null,"δ"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"α"),Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")])]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),t[313]||(t[313]=a(", and ")),Q("mjx-container",E2,[(e(),T("svg",P2,t[300]||(t[300]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D44A",d:"M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z",style:{"stroke-width":"3"}})])])],-1)]))),t[301]||(t[301]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"W")])],-1))]),t[314]||(t[314]=a(" is a diagonal matrix containing the reference volume sizes ")),Q("mjx-container",q2,[(e(),T("svg",N2,t[302]||(t[302]=[l(' ',1)]))),t[303]||(t[303]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mi",null,"I")]),Q("mo",{"data-mjx-texclass":"ORD",stretchy:"false"},"|")])],-1))]),t[315]||(t[315]=a(". The term ")),Q("mjx-container",W2,[(e(),T("svg",K2,t[304]||(t[304]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D439",d:"M48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1Z",style:{"stroke-width":"3"}})])])],-1)]))),t[305]||(t[305]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"F")])],-1))]),t[316]||(t[316]=a(" refers to all the forces except for the pressure gradient."))]),t[395]||(t[395]=Q("div",{class:"tip custom-block"},[Q("p",{class:"custom-block-title"},"Volume normalization"),Q("p",null,"All the operators have been divided by the velocity volume sizes. As a result, the operators have the same units as their continuous counterparts.")],-1)),t[396]||(t[396]=Q("h2",{id:"Discrete-pressure-Poisson-equation",tabindex:"-1"},[a("Discrete pressure Poisson equation "),Q("a",{class:"header-anchor",href:"#Discrete-pressure-Poisson-equation","aria-label":'Permalink to "Discrete pressure Poisson equation {#Discrete-pressure-Poisson-equation}"'},"")],-1)),Q("p",null,[t[319]||(t[319]=a("Instead of directly discretizing the continuous pressure Poisson equation, we will rededuce it in the ")),t[320]||(t[320]=Q("em",null,"discrete",-1)),t[321]||(t[321]=a(" setting, thus aiming to preserve the discrete divergence freeness instead of the continuous one. Applying the discrete divergence operator ")),Q("mjx-container",U2,[(e(),T("svg",$2,t[317]||(t[317]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D440",d:"M289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629Z",style:{"stroke-width":"3"}})])])],-1)]))),t[318]||(t[318]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"M")])],-1))]),t[322]||(t[322]=a(" to the discrete momentum equations yields the discrete pressure Poisson equation"))]),Q("mjx-container",Y2,[(e(),T("svg",_2,t[323]||(t[323]=[l(' ',1)]))),t[324]||(t[324]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mi",null,"L"),Q("msub",null,[Q("mi",null,"p"),Q("mi",null,"h")]),Q("mo",null,"="),Q("mi",null,"W"),Q("mi",null,"M"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"F"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"G")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"+"),Q("mi",null,"W"),Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("mo",null,",")])],-1))]),Q("p",null,[t[327]||(t[327]=a("where ")),Q("mjx-container",Q4,[(e(),T("svg",t4,t[325]||(t[325]=[l(' ',1)]))),t[326]||(t[326]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"L"),Q("mo",null,"="),Q("mi",null,"W"),Q("mi",null,"M"),Q("mi",null,"G"),Q("mo",null,"="),Q("mi",null,"W"),Q("mi",null,"M"),Q("msubsup",null,[Q("mi",null,"W"),Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("msup",null,[Q("mi",null,"M"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"sans-serif"},"T")])]),Q("mi",null,"W")])],-1))]),t[328]||(t[328]=a(" is a discrete Laplace operator. It is positive symmetric."))]),Q("div",a4,[t[339]||(t[339]=Q("p",{class:"custom-block-title"},"Unsteady Dirichlet boundary conditions",-1)),Q("p",null,[t[335]||(t[335]=a("If the equations are prescribed with unsteady Dirichlet boundary conditions, for example an inflow that varies with time, the term ")),Q("mjx-container",T4,[(e(),T("svg",e4,t[329]||(t[329]=[l(' ',1)]))),t[330]||(t[330]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])])])],-1))]),t[336]||(t[336]=a(" will be non-zero. If this term is not known exactly, for example if the next value of the inflow is unknown at the time of the current value, it must be computed using past values of of the velocity inflow only, for example ")),Q("mjx-container",l4,[(e(),T("svg",s4,t[331]||(t[331]=[l(' ',1)]))),t[332]||(t[332]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("mo",null,"≈"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"t"),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"t"),Q("mo",null,"−"),Q("mi",{mathvariant:"normal"},"Δ"),Q("mi",null,"t"),Q("mo",{stretchy:"false"},")"),Q("mo",{stretchy:"false"},")"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mi",{mathvariant:"normal"},"Δ"),Q("mi",null,"t")])],-1))]),t[337]||(t[337]=a(" for some ")),Q("mjx-container",m4,[(e(),T("svg",o4,t[333]||(t[333]=[l(' ',1)]))),t[334]||(t[334]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",{mathvariant:"normal"},"Δ"),Q("mi",null,"t")])],-1))]),t[338]||(t[338]=a("."))])]),Q("div",n4,[t[344]||(t[344]=Q("p",{class:"custom-block-title"},"Uniqueness of pressure field",-1)),Q("p",null,[t[342]||(t[342]=a("Unless pressure boundary conditions are present, the pressure is only determined up to a constant, as ")),Q("mjx-container",d4,[(e(),T("svg",r4,t[340]||(t[340]=[Q("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[Q("g",{"data-mml-node":"math"},[Q("g",{"data-mml-node":"mi"},[Q("path",{"data-c":"1D43F",d:"M228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637Z",style:{"stroke-width":"3"}})])])],-1)]))),t[341]||(t[341]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"L")])],-1))]),t[343]||(t[343]=a(" will have an eigenvalue of zero. Since only the gradient of the pressure appears in the equations, we can set the unknown constant to zero without affecting the velocity field."))])]),Q("div",i4,[t[360]||(t[360]=Q("p",{class:"custom-block-title"},"Pressure projection",-1)),Q("p",null,[t[347]||(t[347]=a("The pressure field ")),Q("mjx-container",h4,[(e(),T("svg",p4,t[345]||(t[345]=[l(' ',1)]))),t[346]||(t[346]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msub",null,[Q("mi",null,"p"),Q("mi",null,"h")])])],-1))]),t[348]||(t[348]=a(" can be seen as a Lagrange multiplier enforcing the constraint of discrete divergence freeness. It is also possible to write the momentum equations without the pressure by explicitly solving the discrete Poisson equation:"))]),Q("mjx-container",g4,[(e(),T("svg",H4,t[349]||(t[349]=[l(' ',1)]))),t[350]||(t[350]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("msub",null,[Q("mi",null,"p"),Q("mi",null,"h")]),Q("mo",null,"="),Q("msup",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("mi",null,"W"),Q("mi",null,"M"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"F"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"G")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"+"),Q("msup",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("mi",null,"W"),Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("mo",null,".")])],-1))]),t[361]||(t[361]=Q("p",null,"The momentum equations then become",-1)),Q("mjx-container",u4,[(e(),T("svg",c4,t[351]||(t[351]=[l(' ',1)]))),t[352]||(t[352]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("mo",null,"="),Q("mo",{stretchy:"false"},"("),Q("mi",null,"I"),Q("mo",null,"−"),Q("mi",null,"G"),Q("msup",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("mi",null,"W"),Q("mi",null,"M"),Q("mo",{stretchy:"false"},")"),Q("mo",{stretchy:"false"},"("),Q("mi",null,"F"),Q("mo",{stretchy:"false"},"("),Q("msub",null,[Q("mi",null,"u"),Q("mi",null,"h")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"G")]),Q("mo",{stretchy:"false"},")"),Q("mo",null,"−"),Q("mi",null,"G"),Q("msup",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("mi",null,"W"),Q("mfrac",null,[Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("msub",null,[Q("mi",null,"y"),Q("mi",null,"M")])]),Q("mrow",null,[Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",null,"t")])]),Q("mo",null,".")])],-1))]),Q("p",null,[t[357]||(t[357]=a("The matrix ")),Q("mjx-container",w4,[(e(),T("svg",x4,t[353]||(t[353]=[l(' ',1)]))),t[354]||(t[354]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{stretchy:"false"},"("),Q("mi",null,"I"),Q("mo",null,"−"),Q("mi",null,"G"),Q("msup",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])]),Q("mi",null,"W"),Q("mi",null,"M"),Q("mo",{stretchy:"false"},")")])],-1))]),t[358]||(t[358]=a(" is a projector onto the space of discretely divergence free velocities. However, using this formulation would require an efficient way to perform the projection without assembling the operator matrix ")),Q("mjx-container",L4,[(e(),T("svg",f4,t[355]||(t[355]=[l(' ',1)]))),t[356]||(t[356]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"L"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"−"),Q("mn",null,"1")])])])],-1))]),t[359]||(t[359]=a(", which would be very costly."))])]),t[397]||(t[397]=Q("h2",{id:"Discrete-output-quantities",tabindex:"-1"},[a("Discrete output quantities "),Q("a",{class:"header-anchor",href:"#Discrete-output-quantities","aria-label":'Permalink to "Discrete output quantities {#Discrete-output-quantities}"'},"")],-1)),t[398]||(t[398]=Q("h3",{id:"Kinetic-energy",tabindex:"-1"},[a("Kinetic energy "),Q("a",{class:"header-anchor",href:"#Kinetic-energy","aria-label":'Permalink to "Kinetic energy {#Kinetic-energy}"'},"")],-1)),Q("p",null,[t[364]||(t[364]=a("The local kinetic energy is defined by ")),Q("mjx-container",y4,[(e(),T("svg",M4,t[362]||(t[362]=[l(' ',1)]))),t[363]||(t[363]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mi",null,"k"),Q("mo",null,"="),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")]),Q("mo",{"data-mjx-texclass":"ORD"},"∥"),Q("mi",null,"u"),Q("msubsup",null,[Q("mo",{"data-mjx-texclass":"ORD"},"∥"),Q("mn",null,"2"),Q("mn",null,"2")]),Q("mo",null,"="),Q("mfrac",null,[Q("mn",null,"1"),Q("mn",null,"2")]),Q("munderover",null,[Q("mo",{"data-mjx-texclass":"OP"},"∑"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"α"),Q("mo",null,"="),Q("mn",null,"1")]),Q("mi",null,"d")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")]),Q("msup",null,[Q("mi",null,"u"),Q("mi",null,"α")])])],-1))]),t[365]||(t[365]=a(". On the staggered grid however, the different velocity components are not located at the same point. We will therefore interpolate the velocity to the pressure point before summing the squares."))]),t[399]||(t[399]=Q("h3",{id:"vorticity",tabindex:"-1"},[a("Vorticity "),Q("a",{class:"header-anchor",href:"#vorticity","aria-label":'Permalink to "Vorticity"'},"")],-1)),t[400]||(t[400]=Q("p",null,"In 2D, the vorticity is a scalar. We define it as",-1)),Q("mjx-container",k4,[(e(),T("svg",V4,t[366]||(t[366]=[l(' ',1)]))),t[367]||(t[367]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mi",null,"ω"),Q("mo",null,"="),Q("mo",null,"−"),Q("msup",null,[Q("mi",null,"δ"),Q("mn",null,"2")]),Q("msup",null,[Q("mi",null,"u"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msup",null,[Q("mi",null,"δ"),Q("mn",null,"1")]),Q("msup",null,[Q("mi",null,"u"),Q("mn",null,"2")]),Q("mo",null,".")])],-1))]),Q("p",null,[t[374]||(t[374]=a("The 3D vorticity is a vector field ")),Q("mjx-container",Z4,[(e(),T("svg",b4,t[368]||(t[368]=[l(' ',1)]))),t[369]||(t[369]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("mo",{stretchy:"false"},"("),Q("msup",null,[Q("mi",null,"ω"),Q("mn",null,"1")]),Q("mo",null,","),Q("msup",null,[Q("mi",null,"ω"),Q("mn",null,"2")]),Q("mo",null,","),Q("msup",null,[Q("mi",null,"ω"),Q("mn",null,"3")]),Q("mo",{stretchy:"false"},")")])],-1))]),t[375]||(t[375]=a(". Noting ")),Q("mjx-container",v4,[(e(),T("svg",D4,t[370]||(t[370]=[l(' ',1)]))),t[371]||(t[371]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"α"),Q("mo",null,"+")]),Q("mo",null,"="),Q("msub",null,[Q("mi",null,"mod"),Q("mn",null,"3")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"α"),Q("mo",null,"+"),Q("mn",null,"1"),Q("mo",{stretchy:"false"},")")])],-1))]),t[376]||(t[376]=a(" and ")),Q("mjx-container",j4,[(e(),T("svg",C4,t[372]||(t[372]=[l(' ',1)]))),t[373]||(t[373]=Q("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[Q("msup",null,[Q("mi",null,"α"),Q("mo",null,"−")]),Q("mo",null,"="),Q("msub",null,[Q("mi",null,"mod"),Q("mn",null,"3")]),Q("mo",{stretchy:"false"},"("),Q("mi",null,"α"),Q("mo",null,"−"),Q("mn",null,"1"),Q("mo",{stretchy:"false"},")")])],-1))]),t[377]||(t[377]=a(", the vorticity is defined as through"))]),Q("mjx-container",O4,[(e(),T("svg",R4,t[378]||(t[378]=[l(' ',1)]))),t[379]||(t[379]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("msup",null,[Q("mi",null,"ω"),Q("mi",null,"α")]),Q("mo",null,"="),Q("mo",null,"−"),Q("msup",null,[Q("mi",null,"δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"α"),Q("mo",null,"−")])])]),Q("msup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"α"),Q("mo",null,"+")])])]),Q("mo",null,"+"),Q("msup",null,[Q("mi",null,"δ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"α"),Q("mo",null,"+")])])]),Q("msup",null,[Q("mi",null,"u"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msup",null,[Q("mi",null,"α"),Q("mo",null,"−")])])]),Q("mo",null,".")])],-1))]),t[401]||(t[401]=Q("h2",{id:"Stream-function",tabindex:"-1"},[a("Stream function "),Q("a",{class:"header-anchor",href:"#Stream-function","aria-label":'Permalink to "Stream function {#Stream-function}"'},"")],-1)),t[402]||(t[402]=Q("p",null,"In 2D, the stream function is defined at the corners with the vorticity. Integrating the stream function Poisson equation over the vorticity volume yields",-1)),Q("mjx-container",F4,[(e(),T("svg",A4,t[380]||(t[380]=[l(' ',1)]))),t[381]||(t[381]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd",null,[Q("mo",null,"−"),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])])]),Q("mi",null,"ω"),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Ω")]),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])])]),Q("msup",null,[Q("mi",{mathvariant:"normal"},"∇"),Q("mn",null,"2")]),Q("mi",null,"ψ"),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Ω")])]),Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mi"),Q("mo",null,"="),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"e"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])]),Q("mn",null,"1")])])]),Q("mfrac",null,[Q("mrow",null,[Q("mi",null,"∂"),Q("mi",null,"ψ")]),Q("mrow",null,[Q("mi",null,"∂"),Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"1")])])]),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Γ"),Q("mo",null,"−"),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])]),Q("mn",null,"1")])])]),Q("mfrac",null,[Q("mrow",null,[Q("mi",null,"∂"),Q("mi",null,"ψ")]),Q("mrow",null,[Q("mi",null,"∂"),Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"1")])])]),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Γ")])]),Q("mtr",null,[Q("mtd"),Q("mtd",null,[Q("mi"),Q("mo",null,"+"),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"e"),Q("mn",null,"2")])]),Q("mn",null,"2")])])]),Q("mfrac",null,[Q("mrow",null,[Q("mi",null,"∂"),Q("mi",null,"ψ")]),Q("mrow",null,[Q("mi",null,"∂"),Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"2")])])]),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Γ"),Q("mo",null,"−"),Q("msub",null,[Q("mo",{"data-mjx-texclass":"OP"},"∫"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")])]),Q("mn",null,"2")])])]),Q("mfrac",null,[Q("mrow",null,[Q("mi",null,"∂"),Q("mi",null,"ψ")]),Q("mrow",null,[Q("mi",null,"∂"),Q("msup",null,[Q("mi",null,"x"),Q("mn",null,"2")])])]),Q("mstyle",{scriptlevel:"0"},[Q("mspace",{width:"0.167em"})]),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",{mathvariant:"normal"},"d")]),Q("mi",{mathvariant:"normal"},"Γ"),Q("mo",null,".")])])])])],-1))]),t[403]||(t[403]=Q("p",null,"Replacing the integrals with the mid-point quadrature rule and the spatial derivatives with central finite differences yields the discrete Poisson equation for the stream function at the vorticity point:",-1)),Q("mjx-container",B4,[(e(),T("svg",X4,t[382]||(t[382]=[l(' ',1)]))),t[383]||(t[383]=Q("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[Q("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[Q("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[Q("mtr",null,[Q("mtd",null,[Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"|"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])]),Q("mn",null,"1")]),Q("mo",{"data-mjx-texclass":"CLOSE"},"|")]),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"("),Q("mfrac",null,[Q("mrow",null,[Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("mn",null,"3"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])]),Q("mrow",null,[Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("mn",null,"3"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"1")]),Q("mo",null,"−"),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"1")])])]),Q("mo",null,"−"),Q("mfrac",null,[Q("mrow",null,[Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])]),Q("mrow",null,[Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"1")]),Q("mo",null,"−"),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,"−"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"1")])])]),Q("mo",{"data-mjx-texclass":"CLOSE"},")")])]),Q("mtd",null,[Q("mi"),Q("mo",null,"+")])]),Q("mtr",null,[Q("mtd",null,[Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"|"),Q("msubsup",null,[Q("mi",{mathvariant:"normal"},"Γ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])]),Q("mn",null,"2")]),Q("mo",{"data-mjx-texclass":"CLOSE"},"|")]),Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"("),Q("mfrac",null,[Q("mrow",null,[Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("mn",null,"3"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])]),Q("mrow",null,[Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("mn",null,"3"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"2")]),Q("mo",null,"−"),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"2")])])]),Q("mo",null,"−"),Q("mfrac",null,[Q("mrow",null,[Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"ψ"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"−"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])]),Q("mrow",null,[Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"2")]),Q("mo",null,"+"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"2")]),Q("mo",null,"−"),Q("msubsup",null,[Q("mi",null,"x"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("msub",null,[Q("mi",null,"I"),Q("mn",null,"2")]),Q("mo",null,"−"),Q("mn",null,"1"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mo",null,"/")]),Q("mn",null,"2")]),Q("mn",null,"2")])])]),Q("mo",{"data-mjx-texclass":"CLOSE"},")")])]),Q("mtd",null,[Q("mi"),Q("mo",null,"=")])]),Q("mtr",null,[Q("mtd",null,[Q("mrow",{"data-mjx-texclass":"INNER"},[Q("mo",{"data-mjx-texclass":"OPEN"},"|"),Q("msub",null,[Q("mi",{mathvariant:"normal"},"Ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])]),Q("mo",{"data-mjx-texclass":"CLOSE"},"|")]),Q("msub",null,[Q("mi",null,"ω"),Q("mrow",{"data-mjx-texclass":"ORD"},[Q("mi",null,"I"),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"1")]),Q("mo",null,"+"),Q("msub",null,[Q("mi",null,"h"),Q("mn",null,"2")])])])]),Q("mtd")])])])],-1))])])}const N4=s(o,[["render",S4]]);export{q4 as __pageData,N4 as default};
diff --git a/previews/PR126/assets/manual_temperature.md.Bxtw-FWq.js b/previews/PR126/assets/manual_temperature.md.Bxtw-FWq.js
new file mode 100644
index 00000000..bc6d0831
--- /dev/null
+++ b/previews/PR126/assets/manual_temperature.md.Bxtw-FWq.js
@@ -0,0 +1,13 @@
+import{_ as t,c as n,a5 as a,j as s,a as p,G as r,B as l,o}from"./chunks/framework.BSoZtefh.js";const b=JSON.parse('{"title":"Temperature equation","description":"","frontmatter":{},"headers":[],"relativePath":"manual/temperature.md","filePath":"manual/temperature.md","lastUpdated":null}'),h={name:"manual/temperature.md"},d={class:"jldocstring custom-block",open:""};function k(u,e,c,E,m,g){const i=l("Badge");return o(),n("div",null,[e[3]||(e[3]=a(`Temperature equation IncompressibleNavierStokes.jl supports adding a temperature equation, which is coupled back to the momentum equation through a gravity term [8 ].
To enable the temperature equation, you need to set the temperature
keyword in setup:
julia setup = Setup (;
+ kwargs ... ,
+ temperature = temperature_equation (; kwargs ... ),
+)
where temperature_equation
can be configured as follows:
`,5)),s("details",d,[s("summary",null,[e[0]||(e[0]=s("a",{id:"IncompressibleNavierStokes.temperature_equation-manual-temperature",href:"#IncompressibleNavierStokes.temperature_equation-manual-temperature"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.temperature_equation")],-1)),e[1]||(e[1]=p()),r(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[2]||(e[2]=a(`julia temperature_equation (
+;
+ Pr,
+ Ra,
+ Ge,
+ dodissipation,
+ boundary_conditions,
+ gdir,
+ nondim_type
+)
Create temperature equation setup (stored in a named tuple).
The equation is parameterized by three dimensionless numbers (Prandtl number, Rayleigh number, and Gebhart number), and requires separate boundary conditions for the temperature
field. The gdir
keyword specifies the direction gravity, while non_dim_type
specifies the type of non-dimensionalization.
source
`,4))])])}const f=t(h,[["render",k]]);export{b as __pageData,f as default};
diff --git a/previews/PR126/assets/manual_temperature.md.Bxtw-FWq.lean.js b/previews/PR126/assets/manual_temperature.md.Bxtw-FWq.lean.js
new file mode 100644
index 00000000..bc6d0831
--- /dev/null
+++ b/previews/PR126/assets/manual_temperature.md.Bxtw-FWq.lean.js
@@ -0,0 +1,13 @@
+import{_ as t,c as n,a5 as a,j as s,a as p,G as r,B as l,o}from"./chunks/framework.BSoZtefh.js";const b=JSON.parse('{"title":"Temperature equation","description":"","frontmatter":{},"headers":[],"relativePath":"manual/temperature.md","filePath":"manual/temperature.md","lastUpdated":null}'),h={name:"manual/temperature.md"},d={class:"jldocstring custom-block",open:""};function k(u,e,c,E,m,g){const i=l("Badge");return o(),n("div",null,[e[3]||(e[3]=a(`Temperature equation IncompressibleNavierStokes.jl supports adding a temperature equation, which is coupled back to the momentum equation through a gravity term [8 ].
To enable the temperature equation, you need to set the temperature
keyword in setup:
julia setup = Setup (;
+ kwargs ... ,
+ temperature = temperature_equation (; kwargs ... ),
+)
where temperature_equation
can be configured as follows:
`,5)),s("details",d,[s("summary",null,[e[0]||(e[0]=s("a",{id:"IncompressibleNavierStokes.temperature_equation-manual-temperature",href:"#IncompressibleNavierStokes.temperature_equation-manual-temperature"},[s("span",{class:"jlbinding"},"IncompressibleNavierStokes.temperature_equation")],-1)),e[1]||(e[1]=p()),r(i,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),e[2]||(e[2]=a(`julia temperature_equation (
+;
+ Pr,
+ Ra,
+ Ge,
+ dodissipation,
+ boundary_conditions,
+ gdir,
+ nondim_type
+)
Create temperature equation setup (stored in a named tuple).
The equation is parameterized by three dimensionless numbers (Prandtl number, Rayleigh number, and Gebhart number), and requires separate boundary conditions for the temperature
field. The gdir
keyword specifies the direction gravity, while non_dim_type
specifies the type of non-dimensionalization.
source
`,4))])])}const f=t(h,[["render",k]]);export{b as __pageData,f as default};
diff --git a/previews/PR126/assets/manual_time.md.DY8-Hmku.js b/previews/PR126/assets/manual_time.md.DY8-Hmku.js
new file mode 100644
index 00000000..10dbc6a7
--- /dev/null
+++ b/previews/PR126/assets/manual_time.md.DY8-Hmku.js
@@ -0,0 +1,174 @@
+import{_ as n,c as Q,j as t,a as s,a5 as e,G as i,B as o,o as l}from"./chunks/framework.BSoZtefh.js";const U4=JSON.parse('{"title":"Time discretization","description":"","frontmatter":{},"headers":[],"relativePath":"manual/time.md","filePath":"manual/time.md","lastUpdated":null}'),r={name:"manual/time.md"},d={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.898ex",height:"4.676ex",role:"img",focusable:"false",viewBox:"0 -1370 11446.9 2067","aria-hidden":"true"},p={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.193ex",height:"2.009ex",role:"img",focusable:"false",viewBox:"0 -683 6273.2 888","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.991ex",height:"3.006ex",role:"img",focusable:"false",viewBox:"0 -975.7 1763.8 1328.5","aria-hidden":"true"},c={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.871ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 1711 1000","aria-hidden":"true"},H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.988ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2204.7 1000","aria-hidden":"true"},y={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.593ex",height:"1.532ex",role:"img",focusable:"false",viewBox:"0 -677 704 677","aria-hidden":"true"},x={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"2.009ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 888 683","aria-hidden":"true"},M={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},L={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.237ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 3640.9 1083.9","aria-hidden":"true"},v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.452ex",height:"1.984ex",role:"img",focusable:"false",viewBox:"0 -683 7272 877","aria-hidden":"true"},Z={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.953ex",height:"2.072ex",role:"img",focusable:"false",viewBox:"0 -833.9 2631.1 915.9","aria-hidden":"true"},D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.035ex",height:"2.099ex",role:"img",focusable:"false",viewBox:"0 -846 3109.5 928","aria-hidden":"true"},V={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.605ex",height:"2.072ex",role:"img",focusable:"false",viewBox:"0 -833.9 6897.5 915.9","aria-hidden":"true"},R={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.478ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4631.1 1000","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.019ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2218.3 1000","aria-hidden":"true"},K={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.484ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 4192.1 1083.9","aria-hidden":"true"},B={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},O={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.442ex",height:"1.553ex",role:"img",focusable:"false",viewBox:"0 -675.5 1079.3 686.5","aria-hidden":"true"},P={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},G={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.02ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 451 453","aria-hidden":"true"},z={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},J={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.415ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 9023.4 1000","aria-hidden":"true"},U={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.357ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 600 453","aria-hidden":"true"},W={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},t1={class:"jldocstring custom-block",open:""},a1={class:"jldocstring custom-block",open:""},s1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.701ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -716 1194 727","aria-hidden":"true"},Q1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.158ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4489.7 1000","aria-hidden":"true"},T1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},i1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.804ex",height:"1.791ex",role:"img",focusable:"false",viewBox:"0 -626 797.6 791.6","aria-hidden":"true"},n1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.869ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 7456.2 1000","aria-hidden":"true"},r1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.471ex"},xmlns:"http://www.w3.org/2000/svg",width:"13.338ex",height:"2.09ex",role:"img",focusable:"false",viewBox:"0 -716 5895.2 924","aria-hidden":"true"},m1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},h1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.105ex",height:"1.994ex",role:"img",focusable:"false",viewBox:"0 -716 4908.6 881.6","aria-hidden":"true"},k1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},c1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-6.059ex"},xmlns:"http://www.w3.org/2000/svg",width:"48.012ex",height:"13.249ex",role:"img",focusable:"false",viewBox:"0 -3178 21221.3 5856","aria-hidden":"true"},u1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},H1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.353ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 3692.2 1000","aria-hidden":"true"},w1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.781ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.874ex",height:"2.737ex",role:"img",focusable:"false",viewBox:"0 -864.9 2596.1 1209.9","aria-hidden":"true"},b1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.791ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.329ex",height:"2.748ex",role:"img",focusable:"false",viewBox:"0 -864.9 8985.2 1214.4","aria-hidden":"true"},f1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.097ex",height:"1.027ex",role:"img",focusable:"false",viewBox:"0 -443 485 454","aria-hidden":"true"},L1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},v1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.097ex",height:"1.027ex",role:"img",focusable:"false",viewBox:"0 -443 485 454","aria-hidden":"true"},E1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},Z1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-8.031ex"},xmlns:"http://www.w3.org/2000/svg",width:"53.662ex",height:"17.192ex",role:"img",focusable:"false",viewBox:"0 -4049.5 23718.8 7599","aria-hidden":"true"},j1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.097ex",height:"1.027ex",role:"img",focusable:"false",viewBox:"0 -443 485 454","aria-hidden":"true"},S1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},V1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.801ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.818ex",height:"2.758ex",role:"img",focusable:"false",viewBox:"0 -864.9 5223.7 1219","aria-hidden":"true"},I1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.701ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -716 1194 727","aria-hidden":"true"},F1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.023ex",height:"2.059ex",role:"img",focusable:"false",viewBox:"0 -716 1336 910","aria-hidden":"true"},N1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},K1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"46.661ex",height:"4.88ex",role:"img",focusable:"false",viewBox:"0 -1460 20624.2 2157","aria-hidden":"true"},A1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},O1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},P1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"34.846ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 15402 1000","aria-hidden":"true"},G1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},z1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.069ex",height:"2.059ex",role:"img",focusable:"false",viewBox:"0 -716 5334.6 910","aria-hidden":"true"},J1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.138ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 503 636","aria-hidden":"true"},X1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},q1={class:"jldocstring custom-block",open:""},$1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Y1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.701ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -716 1194 727","aria-hidden":"true"},_1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},t2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.375ex",role:"img",focusable:"false",viewBox:"0 -442 1008.6 607.6","aria-hidden":"true"},a2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},s2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.126ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 939.6 636","aria-hidden":"true"},e2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.804ex",height:"1.791ex",role:"img",focusable:"false",viewBox:"0 -626 797.6 791.6","aria-hidden":"true"},l2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.471ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.526ex",height:"1.471ex",role:"img",focusable:"false",viewBox:"0 -442 1558.7 650","aria-hidden":"true"},i2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},n2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.471ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.37ex",height:"1.471ex",role:"img",focusable:"false",viewBox:"0 -442 1489.7 650","aria-hidden":"true"},o2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.471ex"},xmlns:"http://www.w3.org/2000/svg",width:"13.338ex",height:"2.09ex",role:"img",focusable:"false",viewBox:"0 -716 5895.2 924","aria-hidden":"true"},d2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.513ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 9066.7 1000","aria-hidden":"true"},p2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.287ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 9408.7 1000","aria-hidden":"true"},g2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.781ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.093ex",height:"2.737ex",role:"img",focusable:"false",viewBox:"0 -864.9 2693.1 1209.9","aria-hidden":"true"},c2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.097ex",height:"1.724ex",role:"img",focusable:"false",viewBox:"0 -751 485 762","aria-hidden":"true"},H2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},w2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.647ex"},xmlns:"http://www.w3.org/2000/svg",width:"65.933ex",height:"5.926ex",role:"img",focusable:"false",viewBox:"0 -1449.5 29142.5 2619.4","aria-hidden":"true"},y2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.023ex",height:"2.059ex",role:"img",focusable:"false",viewBox:"0 -716 1336 910","aria-hidden":"true"},x2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},f2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"30.973ex",height:"5.355ex",role:"img",focusable:"false",viewBox:"0 -1669.9 13690.2 2366.9","aria-hidden":"true"},M2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},L2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.647ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.441ex",height:"5.796ex",role:"img",focusable:"false",viewBox:"0 -1392 9035 2561.9","aria-hidden":"true"},v2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},E2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.602ex"},xmlns:"http://www.w3.org/2000/svg",width:"22.092ex",height:"4.663ex",role:"img",focusable:"false",viewBox:"0 -1353 9764.7 2061","aria-hidden":"true"},Z2={class:"jldocstring custom-block",open:""},j2={class:"jldocstring custom-block",open:""},D2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.375ex",role:"img",focusable:"false",viewBox:"0 -442 1008.6 607.6","aria-hidden":"true"},V2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.804ex",height:"1.791ex",role:"img",focusable:"false",viewBox:"0 -626 797.6 791.6","aria-hidden":"true"},R2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.105ex",height:"1.994ex",role:"img",focusable:"false",viewBox:"0 -716 4908.6 881.6","aria-hidden":"true"},C2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.023ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.061ex",height:"1.023ex",role:"img",focusable:"false",viewBox:"0 -442 469 452","aria-hidden":"true"},K2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.585ex",height:"1.994ex",role:"img",focusable:"false",viewBox:"0 -716 5562.5 881.6","aria-hidden":"true"},B2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},O2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.879ex",height:"1.977ex",role:"img",focusable:"false",viewBox:"0 -716 4808.5 873.8","aria-hidden":"true"},P2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},G2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.355ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.358ex",height:"1.975ex",role:"img",focusable:"false",viewBox:"0 -716 4136.2 873.1","aria-hidden":"true"},z2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},J2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.355ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.589ex",height:"1.772ex",role:"img",focusable:"false",viewBox:"0 -626 2470.2 783.1","aria-hidden":"true"},U2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.031ex",height:"1.946ex",role:"img",focusable:"false",viewBox:"0 -666 4875.6 860","aria-hidden":"true"},W2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.034ex",height:"1.357ex",role:"img",focusable:"false",viewBox:"0 -442 899 599.8","aria-hidden":"true"},$2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Y2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.878ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 830 636","aria-hidden":"true"},_2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},t3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-15.831ex"},xmlns:"http://www.w3.org/2000/svg",width:"44.276ex",height:"32.793ex",role:"img",focusable:"false",viewBox:"0 -7497.2 19570.1 14494.3","aria-hidden":"true"},a3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},s3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.666ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.755ex",height:"2.363ex",role:"img",focusable:"false",viewBox:"0 -750 2543.6 1044.2","aria-hidden":"true"},e3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.972ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.99ex",height:"3.109ex",role:"img",focusable:"false",viewBox:"0 -944.5 5741.5 1374.1","aria-hidden":"true"},l3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.355ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.232ex",height:"1.355ex",role:"img",focusable:"false",viewBox:"0 -442 986.6 599.1","aria-hidden":"true"},i3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},n3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.158ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4489.7 1000","aria-hidden":"true"},o3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.102ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 9327.2 1083.9","aria-hidden":"true"},d3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.02ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 451 453","aria-hidden":"true"},p3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.357ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 600 453","aria-hidden":"true"},g3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.484ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 4192.1 1083.9","aria-hidden":"true"},c3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.415ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 9023.4 1000","aria-hidden":"true"},H3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.567ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6438.6 1000","aria-hidden":"true"},y3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},x3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.138ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 503 636","aria-hidden":"true"},M3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},L3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},v3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.701ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -716 1194 727","aria-hidden":"true"},Z3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.567ex",height:"3.006ex",role:"img",focusable:"false",viewBox:"0 -975.7 2902.8 1328.5","aria-hidden":"true"},D3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.076ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 917.6 636","aria-hidden":"true"},V3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.034ex",height:"1.357ex",role:"img",focusable:"false",viewBox:"0 -442 899 599.8","aria-hidden":"true"},R3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.837ex",height:"1.359ex",role:"img",focusable:"false",viewBox:"0 -443 812 600.8","aria-hidden":"true"},C3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.307ex",height:"3.006ex",role:"img",focusable:"false",viewBox:"0 -975.7 3229.8 1328.5","aria-hidden":"true"},K3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.935ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 9695.2 1000","aria-hidden":"true"},B3={class:"jldocstring custom-block",open:""},O3={class:"jldocstring custom-block",open:""},P3={class:"jldocstring custom-block",open:""},G3={class:"jldocstring custom-block",open:""},z3={class:"jldocstring custom-block",open:""},J3={class:"jldocstring custom-block",open:""},U3={class:"jldocstring custom-block",open:""},X3={class:"jldocstring custom-block",open:""},W3={class:"jldocstring custom-block",open:""},q3={class:"jldocstring custom-block",open:""},$3={class:"jldocstring custom-block",open:""},Y3={class:"jldocstring custom-block",open:""},_3={class:"jldocstring custom-block",open:""},t4={class:"jldocstring custom-block",open:""},a4={class:"jldocstring custom-block",open:""},s4={class:"jldocstring custom-block",open:""},e4={class:"jldocstring custom-block",open:""},Q4={class:"jldocstring custom-block",open:""},l4={class:"jldocstring custom-block",open:""},T4={class:"jldocstring custom-block",open:""},i4={class:"jldocstring custom-block",open:""},n4={class:"jldocstring custom-block",open:""},o4={class:"jldocstring custom-block",open:""},r4={class:"jldocstring custom-block",open:""},d4={class:"jldocstring custom-block",open:""},m4={class:"jldocstring custom-block",open:""},p4={class:"jldocstring custom-block",open:""},h4={class:"jldocstring custom-block",open:""},g4={class:"jldocstring custom-block",open:""},k4={class:"jldocstring custom-block",open:""},c4={class:"jldocstring custom-block",open:""},u4={class:"jldocstring custom-block",open:""},H4={class:"jldocstring custom-block",open:""},w4={class:"jldocstring custom-block",open:""},y4={class:"jldocstring custom-block",open:""},b4={class:"jldocstring custom-block",open:""},x4={class:"jldocstring custom-block",open:""},f4={class:"jldocstring custom-block",open:""},M4={class:"jldocstring custom-block",open:""},L4={class:"jldocstring custom-block",open:""},v4={class:"jldocstring custom-block",open:""},E4={class:"jldocstring custom-block",open:""},Z4={class:"jldocstring custom-block",open:""},j4={class:"jldocstring custom-block",open:""},D4={class:"jldocstring custom-block",open:""},S4={class:"jldocstring custom-block",open:""},V4={class:"jldocstring custom-block",open:""},I4={class:"jldocstring custom-block",open:""},R4={class:"jldocstring custom-block",open:""},F4={class:"jldocstring custom-block",open:""},C4={class:"jldocstring custom-block",open:""},N4={class:"jldocstring custom-block",open:""},K4={class:"jldocstring custom-block",open:""};function A4(B4,a,O4,P4,G4,z4){const T=o("Badge");return l(),Q("div",null,[a[474]||(a[474]=t("h1",{id:"Time-discretization",tabindex:"-1"},[s("Time discretization "),t("a",{class:"header-anchor",href:"#Time-discretization","aria-label":'Permalink to "Time discretization {#Time-discretization}"'},"")],-1)),a[475]||(a[475]=t("p",null,"The spatially discretized Navier-Stokes equations form a differential-algebraic system, with an ODE for the velocity",-1)),t("mjx-container",d,[(l(),Q("svg",m,a[0]||(a[0]=[e(' ',1)]))),a[1]||(a[1]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"u")]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])]),t("mo",null,"="),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mi",null,"u"),t("mo",null,","),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("mi",null,"G"),t("mi",null,"p"),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},")")])],-1))]),a[476]||(a[476]=t("p",null,"subject to the algebraic constraint formed by the mass equation",-1)),t("mjx-container",p,[(l(),Q("svg",h,a[2]||(a[2]=[e(' ',1)]))),a[3]||(a[3]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"M"),t("mi",null,"u"),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",null,"="),t("mn",null,"0.")])],-1))]),t("p",null,[a[8]||(a[8]=s("In the end of the previous section, we differentiated the mass equation in time to obtain a discrete pressure Poisson equation. This equation includes the term ")),t("mjx-container",g,[(l(),Q("svg",k,a[4]||(a[4]=[e(' ',1)]))),a[5]||(a[5]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")])]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])])])],-1))]),a[9]||(a[9]=s(", which is non-zero if an unsteady flow of mass is added to the domain (Dirichlet boundary conditions). This term ensures that the time-continuous discrete velocity field ")),t("mjx-container",c,[(l(),Q("svg",u,a[6]||(a[6]=[e(' ',1)]))),a[7]||(a[7]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")")])],-1))]),a[10]||(a[10]=s(" stays divergence free (conserves mass). However, if we directly discretize this system in time, the mass preservation may actually not be respected. For this, we will change the definition of the pressure such that the time-discretized velocity field is divergence free at each time step and each time sub-step (to be defined in the following)."))]),t("p",null,[a[41]||(a[41]=s("Consider the interval ")),t("mjx-container",H,[(l(),Q("svg",w,a[11]||(a[11]=[e(' ',1)]))),a[12]||(a[12]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"["),t("mn",null,"0"),t("mo",null,","),t("mi",null,"T"),t("mo",{stretchy:"false"},"]")])],-1))]),a[42]||(a[42]=s(" for some simulation time ")),t("mjx-container",y,[(l(),Q("svg",b,a[13]||(a[13]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D447",d:"M40 437Q21 437 21 445Q21 450 37 501T71 602L88 651Q93 669 101 677H569H659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437Q640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631Q469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46Q418 46 427 45T436 36Q436 31 433 22Q429 4 424 1L422 0Q419 0 415 0Q410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83H94Q174 46 189 55Q190 56 191 56Q196 59 201 76T241 233Q258 301 269 344Q339 619 339 625Q339 630 310 630H279Q212 630 191 624Q146 614 121 583T67 467Q60 445 57 441T43 437H40Z",style:{"stroke-width":"3"}})])])],-1)]))),a[14]||(a[14]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"T")])],-1))]),a[43]||(a[43]=s(". We will divide it into ")),t("mjx-container",x,[(l(),Q("svg",f,a[15]||(a[15]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D441",d:"M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z",style:{"stroke-width":"3"}})])])],-1)]))),a[16]||(a[16]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"N")])],-1))]),a[44]||(a[44]=s(" sub-intervals ")),t("mjx-container",M,[(l(),Q("svg",L,a[17]||(a[17]=[e(' ',1)]))),a[18]||(a[18]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"["),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")]),t("mo",null,","),t("msup",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"n"),t("mo",null,"+"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},"]")])],-1))]),a[45]||(a[45]=s(" for ")),t("mjx-container",v,[(l(),Q("svg",E,a[19]||(a[19]=[e(' ',1)]))),a[20]||(a[20]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"n"),t("mo",null,"="),t("mn",null,"0"),t("mo",null,","),t("mo",null,"…"),t("mo",null,","),t("mi",null,"N"),t("mo",null,"−"),t("mn",null,"1")])],-1))]),a[46]||(a[46]=s(", with ")),t("mjx-container",Z,[(l(),Q("svg",j,a[21]||(a[21]=[e(' ',1)]))),a[22]||(a[22]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"="),t("mn",null,"0")])],-1))]),a[47]||(a[47]=s(", ")),t("mjx-container",D,[(l(),Q("svg",S,a[23]||(a[23]=[e(' ',1)]))),a[24]||(a[24]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"t"),t("mi",null,"N")]),t("mo",null,"="),t("mi",null,"T")])],-1))]),a[48]||(a[48]=s(", and increment ")),t("mjx-container",V,[(l(),Q("svg",I,a[25]||(a[25]=[e(' ',1)]))),a[26]||(a[26]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")]),t("mo",null,"="),t("msup",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"n"),t("mo",null,"+"),t("mn",null,"1")])]),t("mo",null,"−"),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")])])],-1))]),a[49]||(a[49]=s(". We define ")),t("mjx-container",R,[(l(),Q("svg",F,a[27]||(a[27]=[e(' ',1)]))),a[28]||(a[28]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"u"),t("mi",null,"n")]),t("mo",null,"≈"),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")]),t("mo",{stretchy:"false"},")")])],-1))]),a[50]||(a[50]=s(" as an approximation to the exact discrete velocity field ")),t("mjx-container",C,[(l(),Q("svg",N,a[29]||(a[29]=[e(' ',1)]))),a[30]||(a[30]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")]),t("mo",{stretchy:"false"},")")])],-1))]),a[51]||(a[51]=s(", with ")),t("mjx-container",K,[(l(),Q("svg",A,a[31]||(a[31]=[e(' ',1)]))),a[32]||(a[32]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("mn",null,"0"),t("mo",{stretchy:"false"},")")])],-1))]),a[52]||(a[52]=s(" starting from the exact initial conditions. We say that the time integration scheme (definition of ")),t("mjx-container",B,[(l(),Q("svg",O,a[33]||(a[33]=[e(' ',1)]))),a[34]||(a[34]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"u"),t("mi",null,"n")])])],-1))]),a[53]||(a[53]=s(") is accurate to the order ")),t("mjx-container",P,[(l(),Q("svg",G,a[35]||(a[35]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45F",d:"M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[36]||(a[36]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"r")])],-1))]),a[54]||(a[54]=s(" if ")),t("mjx-container",z,[(l(),Q("svg",J,a[37]||(a[37]=[e(' ',1)]))),a[38]||(a[38]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"u"),t("mi",null,"n")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{stretchy:"false"},"("),t("mi",{mathvariant:"normal"},"Δ"),t("msup",null,[t("mi",null,"t"),t("mi",null,"r")]),t("mo",{stretchy:"false"},")")])],-1))]),a[55]||(a[55]=s(" for all ")),t("mjx-container",U,[(l(),Q("svg",X,a[39]||(a[39]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45B",d:"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[40]||(a[40]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"n")])],-1))]),a[56]||(a[56]=s("."))]),a[477]||(a[477]=t("p",null,"IncompressibleNavierStokes provides a collection of explicit and implicit Runge-Kutta methods, in addition to Adams-Bashforth Crank-Nicolson and one-leg beta method time steppers.",-1)),a[478]||(a[478]=t("p",null,[s("The code is currently not adapted to time steppers from "),t("a",{href:"https://docs.sciml.ai/DiffEqDocs/stable/solvers/dae_solve/",target:"_blank",rel:"noreferrer"},"DifferentialEquations.jl"),s(", but they may be integrated in the future.")],-1)),t("details",W,[t("summary",null,[a[57]||(a[57]=t("a",{id:"IncompressibleNavierStokes.AbstractODEMethod",href:"#IncompressibleNavierStokes.AbstractODEMethod"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.AbstractODEMethod")],-1)),a[58]||(a[58]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[59]||(a[59]=e('julia abstract type AbstractODEMethod{T}
Abstract ODE method.
Fields
source
',4))]),t("details",q,[t("summary",null,[a[60]||(a[60]=t("a",{id:"IncompressibleNavierStokes.ode_method_cache",href:"#IncompressibleNavierStokes.ode_method_cache"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.ode_method_cache")],-1)),a[61]||(a[61]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[62]||(a[62]=e('julia ode_method_cache (method, setup, u, temp)
Get time stepper cache for the given ODE method.
source
',3))]),t("details",$,[t("summary",null,[a[63]||(a[63]=t("a",{id:"IncompressibleNavierStokes.runge_kutta_method",href:"#IncompressibleNavierStokes.runge_kutta_method"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.runge_kutta_method")],-1)),a[64]||(a[64]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[65]||(a[65]=e(`julia runge_kutta_method (
+ A,
+ b,
+ c,
+ r;
+ T,
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
Get Runge Kutta method. The function checks whether the method is explicit.
p_add_solve
: whether to add a pressure solve step to the method.
For implicit RK methods: newton_type
, maxiter
, abstol
, reltol
.
source
`,5))]),t("details",Y,[t("summary",null,[a[66]||(a[66]=t("a",{id:"IncompressibleNavierStokes.create_stepper",href:"#IncompressibleNavierStokes.create_stepper"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.create_stepper")],-1)),a[67]||(a[67]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[68]||(a[68]=e('julia create_stepper (method; setup, psolver, u, temp, t, n)
Create time stepper.
source
',3))]),t("details",_,[t("summary",null,[a[69]||(a[69]=t("a",{id:"IncompressibleNavierStokes.timestep",href:"#IncompressibleNavierStokes.timestep"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.timestep")],-1)),a[70]||(a[70]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[71]||(a[71]=e('julia timestep (method, stepper, Δt; θ = nothing )
Perform one time step.
Non-mutating/allocating/out-of-place version.
See also timestep!
.
source
',5))]),t("details",t1,[t("summary",null,[a[72]||(a[72]=t("a",{id:"IncompressibleNavierStokes.timestep!",href:"#IncompressibleNavierStokes.timestep!"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.timestep!")],-1)),a[73]||(a[73]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[74]||(a[74]=e('julia timestep! (method, stepper, Δt; θ = nothing , cache)
Perform one time step>
Mutating/non-allocating/in-place version.
See also timestep
.
source
',5))]),a[479]||(a[479]=t("h2",{id:"Adams-Bashforth-Crank-Nicolson-method",tabindex:"-1"},[s("Adams-Bashforth Crank-Nicolson method "),t("a",{class:"header-anchor",href:"#Adams-Bashforth-Crank-Nicolson-method","aria-label":'Permalink to "Adams-Bashforth Crank-Nicolson method {#Adams-Bashforth-Crank-Nicolson-method}"'},"")],-1)),t("details",a1,[t("summary",null,[a[75]||(a[75]=t("a",{id:"IncompressibleNavierStokes.AdamsBashforthCrankNicolsonMethod",href:"#IncompressibleNavierStokes.AdamsBashforthCrankNicolsonMethod"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.AdamsBashforthCrankNicolsonMethod")],-1)),a[76]||(a[76]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[151]||(a[151]=e('julia struct AdamsBashforthCrankNicolsonMethod{T, M} <: IncompressibleNavierStokes.AbstractODEMethod{T}
IMEX AB-CN: Adams-Bashforth for explicit convection (parameters α₁
and α₂
) and Crank-Nicolson for implicit diffusion (implicitness θ
). The method is second order for θ = 1/2
.
The LU decomposition of the LHS matrix is computed every time the time step changes.
Note that, in contrast to explicit methods, the pressure from previous time steps has an influence on the accuracy of the velocity.
',4)),t("p",null,[a[91]||(a[91]=s("We here require that the time step ")),t("mjx-container",s1,[(l(),Q("svg",e1,a[77]||(a[77]=[e(' ',1)]))),a[78]||(a[78]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[92]||(a[92]=s(" is constant. This methods uses Adams-Bashforth for the convective terms and Crank-Nicolson stepping for the diffusion and body force terms. Given the velocity field ")),t("mjx-container",Q1,[(l(),Q("svg",l1,a[79]||(a[79]=[e(' ',1)]))),a[80]||(a[80]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")")])],-1))]),a[93]||(a[93]=s(" at a time ")),t("mjx-container",T1,[(l(),Q("svg",i1,a[81]||(a[81]=[e(' ',1)]))),a[82]||(a[82]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mn",null,"0")])])],-1))]),a[94]||(a[94]=s(" and its previous value ")),t("mjx-container",n1,[(l(),Q("svg",o1,a[83]||(a[83]=[e(' ',1)]))),a[84]||(a[84]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t"),t("mo",{stretchy:"false"},")")])],-1))]),a[95]||(a[95]=s(" at the previous time ")),t("mjx-container",r1,[(l(),Q("svg",d1,a[85]||(a[85]=[e(' ',1)]))),a[86]||(a[86]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,"="),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[96]||(a[96]=s(", the predicted velocity field ")),t("mjx-container",m1,[(l(),Q("svg",p1,a[87]||(a[87]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D462",d:"M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[88]||(a[88]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u")])],-1))]),a[97]||(a[97]=s(" at the time ")),t("mjx-container",h1,[(l(),Q("svg",g1,a[89]||(a[89]=[e(' ',1)]))),a[90]||(a[90]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"t"),t("mo",null,"="),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[98]||(a[98]=s(" is defined by first computing a tentative velocity:"))]),t("mjx-container",k1,[(l(),Q("svg",c1,a[99]||(a[99]=[e(' ',1)]))),a[100]||(a[100]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mrow",null,[t("mi",null,"v"),t("mo",null,"−"),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")])]),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"α"),t("mn",null,"0")]),t("mi",null,"C"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,","),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("msub",null,[t("mi",null,"α"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mi",null,"C"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,","),t("msub",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"+"),t("mi",null,"θ"),t("mo",{stretchy:"false"},"("),t("mi",null,"D"),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"D")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"−"),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},"("),t("mi",null,"D"),t("mi",null,"v"),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"D")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"+"),t("mi",null,"θ"),t("mi",null,"f"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"−"),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mi",null,"f"),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("mi",null,"G"),t("msub",null,[t("mi",null,"p"),t("mn",null,"0")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,",")])])])])],-1))]),t("p",null,[a[111]||(a[111]=s("where ")),t("mjx-container",u1,[(l(),Q("svg",H1,a[101]||(a[101]=[e(' ',1)]))),a[102]||(a[102]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"θ"),t("mo",null,"∈"),t("mo",{stretchy:"false"},"["),t("mn",null,"0"),t("mo",null,","),t("mn",null,"1"),t("mo",{stretchy:"false"},"]")])],-1))]),a[112]||(a[112]=s(" is the Crank-Nicolson parameter (")),t("mjx-container",w1,[(l(),Q("svg",y1,a[103]||(a[103]=[e(' ',1)]))),a[104]||(a[104]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"θ"),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")])])],-1))]),a[113]||(a[113]=s(" for second order convergence), ")),t("mjx-container",b1,[(l(),Q("svg",x1,a[105]||(a[105]=[e(' ',1)]))),a[106]||(a[106]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"α"),t("mn",null,"0")]),t("mo",null,","),t("msub",null,[t("mi",null,"α"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},")"),t("mo",null,"="),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mfrac",null,[t("mn",null,"3"),t("mn",null,"2")]),t("mo",null,","),t("mo",null,"−"),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")]),t("mo",{"data-mjx-texclass":"CLOSE"},")")])])],-1))]),a[114]||(a[114]=s(" are the Adams-Bashforth coefficients, and ")),t("mjx-container",f1,[(l(),Q("svg",M1,a[107]||(a[107]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D463",d:"M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z",style:{"stroke-width":"3"}})])])],-1)]))),a[108]||(a[108]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"v")])],-1))]),a[115]||(a[115]=s(" is a tentative velocity yet to be made divergence free. We can group the terms containing ")),t("mjx-container",L1,[(l(),Q("svg",v1,a[109]||(a[109]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D463",d:"M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z",style:{"stroke-width":"3"}})])])],-1)]))),a[110]||(a[110]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"v")])],-1))]),a[116]||(a[116]=s(" on the left hand side, to obtain"))]),t("mjx-container",E1,[(l(),Q("svg",Z1,a[117]||(a[117]=[e(' ',1)]))),a[118]||(a[118]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])]),t("mi",null,"I"),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"−"),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mi",null,"D"),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("mi",null,"v")]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])]),t("mi",null,"I"),t("mo",null,"−"),t("mi",null,"θ"),t("mi",null,"D"),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")])])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"α"),t("mn",null,"0")]),t("mi",null,"C"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,","),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("msub",null,[t("mi",null,"α"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mi",null,"C"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,","),t("msub",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"+"),t("mi",null,"θ"),t("msub",null,[t("mi",null,"y"),t("mi",null,"D")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"−"),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("msub",null,[t("mi",null,"y"),t("mi",null,"D")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"+"),t("mi",null,"θ"),t("mi",null,"f"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"−"),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mi",null,"f"),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("mi",null,"G"),t("msub",null,[t("mi",null,"p"),t("mn",null,"0")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,".")])])])])],-1))]),t("p",null,[a[125]||(a[125]=s("We can compute ")),t("mjx-container",j1,[(l(),Q("svg",D1,a[119]||(a[119]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D463",d:"M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z",style:{"stroke-width":"3"}})])])],-1)]))),a[120]||(a[120]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"v")])],-1))]),a[126]||(a[126]=s(" by inverting the positive definite matrix ")),t("mjx-container",S1,[(l(),Q("svg",V1,a[121]||(a[121]=[e(' ',1)]))),a[122]||(a[122]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])]),t("mi",null,"I"),t("mo",null,"−"),t("mi",null,"θ"),t("mi",null,"D"),t("mo",{"data-mjx-texclass":"CLOSE"},")")])])],-1))]),a[127]||(a[127]=s(" for the given right hand side using a suitable linear solver. Assuming ")),t("mjx-container",I1,[(l(),Q("svg",R1,a[123]||(a[123]=[e(' ',1)]))),a[124]||(a[124]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[128]||(a[128]=s(" is constant, we can precompute a Cholesky factorization of this matrix before starting time stepping."))]),t("p",null,[a[131]||(a[131]=s("We then compute the pressure difference ")),t("mjx-container",F1,[(l(),Q("svg",C1,a[129]||(a[129]=[e(' ',1)]))),a[130]||(a[130]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p")])],-1))]),a[132]||(a[132]=s(" by solving"))]),t("mjx-container",N1,[(l(),Q("svg",K1,a[133]||(a[133]=[e(' ',1)]))),a[134]||(a[134]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"L"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p"),t("mo",null,"="),t("mi",null,"W"),t("mfrac",null,[t("mrow",null,[t("mi",null,"M"),t("mi",null,"v"),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")")]),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])]),t("mo",null,"−"),t("mi",null,"W"),t("mi",null,"M"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,",")])],-1))]),t("p",null,[a[137]||(a[137]=s("after which a divergence free velocity ")),t("mjx-container",A1,[(l(),Q("svg",B1,a[135]||(a[135]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D462",d:"M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[136]||(a[136]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u")])],-1))]),a[138]||(a[138]=s(" can be enforced:"))]),t("mjx-container",O1,[(l(),Q("svg",P1,a[139]||(a[139]=[e(' ',1)]))),a[140]||(a[140]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"u"),t("mo",null,"="),t("mi",null,"v"),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t"),t("mo",{stretchy:"false"},"("),t("mi",null,"G"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p"),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,".")])],-1))]),t("p",null,[a[147]||(a[147]=s("A first order accurate prediction of the corresponding pressure is ")),t("mjx-container",G1,[(l(),Q("svg",z1,a[141]||(a[141]=[e(' ',1)]))),a[142]||(a[142]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"p"),t("mo",null,"="),t("msub",null,[t("mi",null,"p"),t("mn",null,"0")]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p")])],-1))]),a[148]||(a[148]=s(". However, since this pressure is reused in the next time step, we perform an additional pressure solve to avoid accumulating first order errors. The resulting pressure ")),t("mjx-container",J1,[(l(),Q("svg",U1,a[143]||(a[143]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45D",d:"M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z",style:{"stroke-width":"3"}})])])],-1)]))),a[144]||(a[144]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"p")])],-1))]),a[149]||(a[149]=s(" is then accurate to the same order as ")),t("mjx-container",X1,[(l(),Q("svg",W1,a[145]||(a[145]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D462",d:"M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[146]||(a[146]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u")])],-1))]),a[150]||(a[150]=s("."))]),a[152]||(a[152]=e('Fields
α₁
α₂
θ
p_add_solve
method_startup
source
',3))]),a[480]||(a[480]=t("h2",{id:"One-leg-beta-method",tabindex:"-1"},[s("One-leg beta method "),t("a",{class:"header-anchor",href:"#One-leg-beta-method","aria-label":'Permalink to "One-leg beta method {#One-leg-beta-method}"'},"")],-1)),t("details",q1,[t("summary",null,[a[153]||(a[153]=t("a",{id:"IncompressibleNavierStokes.OneLegMethod",href:"#IncompressibleNavierStokes.OneLegMethod"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.OneLegMethod")],-1)),a[154]||(a[154]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[202]||(a[202]=e('julia struct OneLegMethod{T, M} <: IncompressibleNavierStokes.AbstractODEMethod{T}
Explicit one-leg β-method following symmetry-preserving discretization of turbulent flow. See Verstappen and Veldman [14 ] [16 ] for details.
',2)),t("p",null,[a[175]||(a[175]=s("We here require that the time step ")),t("mjx-container",$1,[(l(),Q("svg",Y1,a[155]||(a[155]=[e(' ',1)]))),a[156]||(a[156]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[176]||(a[176]=s(" is constant. Given the velocity ")),t("mjx-container",_1,[(l(),Q("svg",t2,a[157]||(a[157]=[e(' ',1)]))),a[158]||(a[158]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mn",null,"0")])])],-1))]),a[177]||(a[177]=s(" and pressure ")),t("mjx-container",a2,[(l(),Q("svg",s2,a[159]||(a[159]=[e(' ',1)]))),a[160]||(a[160]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"p"),t("mn",null,"0")])])],-1))]),a[178]||(a[178]=s(" at the current time ")),t("mjx-container",e2,[(l(),Q("svg",Q2,a[161]||(a[161]=[e(' ',1)]))),a[162]||(a[162]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mn",null,"0")])])],-1))]),a[179]||(a[179]=s(" and their previous values ")),t("mjx-container",l2,[(l(),Q("svg",T2,a[163]||(a[163]=[e(' ',1)]))),a[164]||(a[164]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])])])],-1))]),a[180]||(a[180]=s(" and ")),t("mjx-container",i2,[(l(),Q("svg",n2,a[165]||(a[165]=[e(' ',1)]))),a[166]||(a[166]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"p"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])])])],-1))]),a[181]||(a[181]=s(" at the time ")),t("mjx-container",o2,[(l(),Q("svg",r2,a[167]||(a[167]=[e(' ',1)]))),a[168]||(a[168]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,"="),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[182]||(a[182]=s(', we start by computing the "offstep" values ')),t("mjx-container",d2,[(l(),Q("svg",m2,a[169]||(a[169]=[e(' ',1)]))),a[170]||(a[170]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"v"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"+"),t("mi",null,"β"),t("mo",{stretchy:"false"},")"),t("msub",null,[t("mi",null,"v"),t("mn",null,"0")]),t("mo",null,"−"),t("mi",null,"β"),t("msub",null,[t("mi",null,"v"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])])])],-1))]),a[183]||(a[183]=s(" and ")),t("mjx-container",p2,[(l(),Q("svg",h2,a[171]||(a[171]=[e(' ',1)]))),a[172]||(a[172]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"Q"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"+"),t("mi",null,"β"),t("mo",{stretchy:"false"},")"),t("msub",null,[t("mi",null,"p"),t("mn",null,"0")]),t("mo",null,"−"),t("mi",null,"β"),t("msub",null,[t("mi",null,"p"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])])])],-1))]),a[184]||(a[184]=s(" for some ")),t("mjx-container",g2,[(l(),Q("svg",k2,a[173]||(a[173]=[e(' ',1)]))),a[174]||(a[174]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"β"),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")])])],-1))]),a[185]||(a[185]=s("."))]),t("p",null,[a[188]||(a[188]=s("A tentative velocity field ")),t("mjx-container",c2,[(l(),Q("svg",u2,a[186]||(a[186]=[e(' ',1)]))),a[187]||(a[187]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"~")])])])],-1))]),a[189]||(a[189]=s(" is then computed as follows:"))]),t("mjx-container",H2,[(l(),Q("svg",w2,a[190]||(a[190]=[e(' ',1)]))),a[191]||(a[191]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"~")])]),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mi",null,"β"),t("mo",null,"+"),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")])])]),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mn",null,"2"),t("mi",null,"β"),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"−"),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mi",null,"β"),t("mo",null,"−"),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")]),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("msub",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t"),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mi",null,"v"),t("mo",null,","),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t"),t("mo",{stretchy:"false"},"("),t("mi",null,"G"),t("mi",null,"Q"),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("mo",null,".")])],-1))]),t("p",null,[a[194]||(a[194]=s("A pressure correction ")),t("mjx-container",y2,[(l(),Q("svg",b2,a[192]||(a[192]=[e(' ',1)]))),a[193]||(a[193]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p")])],-1))]),a[195]||(a[195]=s(" is obtained by solving the Poisson equation"))]),t("mjx-container",x2,[(l(),Q("svg",f2,a[196]||(a[196]=[e(' ',1)]))),a[197]||(a[197]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"L"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p"),t("mo",null,"="),t("mfrac",null,[t("mrow",null,[t("mi",null,"β"),t("mo",null,"+"),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")])]),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])]),t("mi",null,"W"),t("mo",{stretchy:"false"},"("),t("mi",null,"M"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"~")])]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,".")])],-1))]),a[203]||(a[203]=t("p",null,"Finally, the divergence free velocity field is given by",-1)),t("mjx-container",M2,[(l(),Q("svg",L2,a[198]||(a[198]=[e(' ',1)]))),a[199]||(a[199]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"u"),t("mo",null,"="),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"~")])]),t("mo",null,"−"),t("mfrac",null,[t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")]),t("mrow",null,[t("mi",null,"β"),t("mo",null,"+"),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")])])]),t("mi",null,"G"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p"),t("mo",null,",")])],-1))]),a[204]||(a[204]=t("p",null,"while the second order accurate pressure is given by",-1)),t("mjx-container",v2,[(l(),Q("svg",E2,a[200]||(a[200]=[e(' ',1)]))),a[201]||(a[201]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"p"),t("mo",null,"="),t("mn",null,"2"),t("msub",null,[t("mi",null,"p"),t("mn",null,"0")]),t("mo",null,"−"),t("msub",null,[t("mi",null,"p"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,"+"),t("mfrac",null,[t("mn",null,"4"),t("mn",null,"3")]),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p"),t("mo",null,".")])],-1))]),a[205]||(a[205]=t("p",null,[t("strong",null,"Fields")],-1)),a[206]||(a[206]=t("ul",null,[t("li",null,[t("p",null,[t("code",null,"β")])]),t("li",null,[t("p",null,[t("code",null,"p_add_solve")])]),t("li",null,[t("p",null,[t("code",null,"method_startup")])])],-1)),a[207]||(a[207]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/time_steppers/methods.jl#L90",target:"_blank",rel:"noreferrer"},"source")],-1))]),a[481]||(a[481]=t("h2",{id:"Runge-Kutta-methods",tabindex:"-1"},[s("Runge-Kutta methods "),t("a",{class:"header-anchor",href:"#Runge-Kutta-methods","aria-label":'Permalink to "Runge-Kutta methods {#Runge-Kutta-methods}"'},"")],-1)),t("details",Z2,[t("summary",null,[a[208]||(a[208]=t("a",{id:"IncompressibleNavierStokes.AbstractRungeKuttaMethod",href:"#IncompressibleNavierStokes.AbstractRungeKuttaMethod"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.AbstractRungeKuttaMethod")],-1)),a[209]||(a[209]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[210]||(a[210]=e('julia abstract type AbstractRungeKuttaMethod{T} <: IncompressibleNavierStokes.AbstractODEMethod{T}
Abstract Runge Kutta method.
Fields
source
',4))]),t("details",j2,[t("summary",null,[a[211]||(a[211]=t("a",{id:"IncompressibleNavierStokes.ExplicitRungeKuttaMethod",href:"#IncompressibleNavierStokes.ExplicitRungeKuttaMethod"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.ExplicitRungeKuttaMethod")],-1)),a[212]||(a[212]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[313]||(a[313]=e('julia struct ExplicitRungeKuttaMethod{T} <: IncompressibleNavierStokes.AbstractRungeKuttaMethod{T}
Explicit Runge Kutta method. See Sanderse [17 ].
',2)),t("p",null,[a[229]||(a[229]=s("Consider the velocity field ")),t("mjx-container",D2,[(l(),Q("svg",S2,a[213]||(a[213]=[e(' ',1)]))),a[214]||(a[214]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mn",null,"0")])])],-1))]),a[230]||(a[230]=s(" at a certain time ")),t("mjx-container",V2,[(l(),Q("svg",I2,a[215]||(a[215]=[e(' ',1)]))),a[216]||(a[216]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mn",null,"0")])])],-1))]),a[231]||(a[231]=s(". We will now perform one time step to ")),t("mjx-container",R2,[(l(),Q("svg",F2,a[217]||(a[217]=[e(' ',1)]))),a[218]||(a[218]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"t"),t("mo",null,"="),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[232]||(a[232]=s(". For explicit Runge-Kutta methods, this time step is divided into ")),t("mjx-container",C2,[(l(),Q("svg",N2,a[219]||(a[219]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D460",d:"M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z",style:{"stroke-width":"3"}})])])],-1)]))),a[220]||(a[220]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"s")])],-1))]),a[233]||(a[233]=s(" sub-steps ")),t("mjx-container",K2,[(l(),Q("svg",A2,a[221]||(a[221]=[e(' ',1)]))),a[222]||(a[222]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",null,"="),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"Δ"),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")])])],-1))]),a[234]||(a[234]=s(" with increment ")),t("mjx-container",B2,[(l(),Q("svg",O2,a[223]||(a[223]=[e(' ',1)]))),a[224]||(a[224]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",null,"="),t("msub",null,[t("mi",null,"c"),t("mi",null,"i")]),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[235]||(a[235]=s(". The final substep performs the full time step ")),t("mjx-container",P2,[(l(),Q("svg",G2,a[225]||(a[225]=[e(' ',1)]))),a[226]||(a[226]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("msub",null,[t("mi",null,"t"),t("mi",null,"s")]),t("mo",null,"="),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[236]||(a[236]=s(" such that ")),t("mjx-container",z2,[(l(),Q("svg",J2,a[227]||(a[227]=[e(' ',1)]))),a[228]||(a[228]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mi",null,"s")]),t("mo",null,"="),t("mi",null,"t")])],-1))]),a[237]||(a[237]=s("."))]),t("p",null,[a[244]||(a[244]=s("For ")),t("mjx-container",U2,[(l(),Q("svg",X2,a[238]||(a[238]=[e(' ',1)]))),a[239]||(a[239]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"i"),t("mo",null,"="),t("mn",null,"1"),t("mo",null,","),t("mo",null,"…"),t("mo",null,","),t("mi",null,"s")])],-1))]),a[245]||(a[245]=s(", the intermediate velocity ")),t("mjx-container",W2,[(l(),Q("svg",q2,a[240]||(a[240]=[e(' ',1)]))),a[241]||(a[241]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mi",null,"i")])])],-1))]),a[246]||(a[246]=s(" and pressure ")),t("mjx-container",$2,[(l(),Q("svg",Y2,a[242]||(a[242]=[e(' ',1)]))),a[243]||(a[243]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"p"),t("mi",null,"i")])])],-1))]),a[247]||(a[247]=s(" are computed as follows:"))]),t("mjx-container",_2,[(l(),Q("svg",t3,a[248]||(a[248]=[e(' ',1)]))),a[249]||(a[249]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("msub",null,[t("mi",null,"k"),t("mi",null,"i")])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,","),t("msub",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mo",null,"−"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mo",null,"−"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd",null,[t("msub",null,[t("mi",null,"v"),t("mi",null,"i")])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t"),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"j"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"i")]),t("msub",null,[t("mi",null,"a"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("msub",null,[t("mi",null,"k"),t("mi",null,"j")])])]),t("mtr",null,[t("mtd",null,[t("mi",null,"L"),t("msub",null,[t("mi",null,"p"),t("mi",null,"i")])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"W"),t("mi",null,"M"),t("mfrac",null,[t("mn",null,"1"),t("msub",null,[t("mi",null,"c"),t("mi",null,"i")])]),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"j"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"i")]),t("msub",null,[t("mi",null,"a"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("msub",null,[t("mi",null,"k"),t("mi",null,"j")]),t("mo",null,"+"),t("mi",null,"W"),t("mfrac",null,[t("mrow",null,[t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")")]),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")])])])])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"W"),t("mfrac",null,[t("mrow",null,[t("mo",{stretchy:"false"},"("),t("mi",null,"M"),t("msub",null,[t("mi",null,"v"),t("mi",null,"i")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("mi",null,"M"),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")")]),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("msubsup",null,[t("mi",null,"t"),t("mi",null,"i"),t("mi",null,"n")])])])])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"W"),t("mfrac",null,[t("mrow",null,[t("mi",null,"M"),t("msub",null,[t("mi",null,"v"),t("mi",null,"i")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",{stretchy:"false"},")")]),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("msubsup",null,[t("mi",null,"t"),t("mi",null,"i"),t("mi",null,"n")])])])])]),t("mtr",null,[t("mtd",null,[t("msub",null,[t("mi",null,"u"),t("mi",null,"i")])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("msub",null,[t("mi",null,"v"),t("mi",null,"i")]),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"Δ"),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mi",null,"G"),t("msub",null,[t("mi",null,"p"),t("mi",null,"i")]),t("mo",null,",")])])])])],-1))]),t("p",null,[a[254]||(a[254]=s("where ")),t("mjx-container",a3,[(l(),Q("svg",s3,a[250]||(a[250]=[e(' ',1)]))),a[251]||(a[251]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"a"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("msub",null,[t("mo",{stretchy:"false"},")"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])])])],-1))]),a[255]||(a[255]=s(" are the Butcher tableau coefficients of the RK-method, with the convention ")),t("mjx-container",e3,[(l(),Q("svg",Q3,a[252]||(a[252]=[e(' ',1)]))),a[253]||(a[253]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"c"),t("mi",null,"i")]),t("mo",null,"="),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"j"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"i")]),t("msub",null,[t("mi",null,"a"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])])])],-1))]),a[256]||(a[256]=s("."))]),t("p",null,[a[285]||(a[285]=s("Finally, we return ")),t("mjx-container",l3,[(l(),Q("svg",T3,a[257]||(a[257]=[e(' ',1)]))),a[258]||(a[258]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mi",null,"s")])])],-1))]),a[286]||(a[286]=s(". If ")),t("mjx-container",i3,[(l(),Q("svg",n3,a[259]||(a[259]=[e(' ',1)]))),a[260]||(a[260]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")")])],-1))]),a[287]||(a[287]=s(", we get the accuracy ")),t("mjx-container",o3,[(l(),Q("svg",r3,a[261]||(a[261]=[e(' ',1)]))),a[262]||(a[262]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mi",null,"s")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{stretchy:"false"},"("),t("mi",{mathvariant:"normal"},"Δ"),t("msup",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"r"),t("mo",null,"+"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},")")])],-1))]),a[288]||(a[288]=s(", where ")),t("mjx-container",d3,[(l(),Q("svg",m3,a[263]||(a[263]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45F",d:"M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[264]||(a[264]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"r")])],-1))]),a[289]||(a[289]=s(" is the order of the RK-method. If we perform ")),t("mjx-container",p3,[(l(),Q("svg",h3,a[265]||(a[265]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45B",d:"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[266]||(a[266]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"n")])],-1))]),a[290]||(a[290]=s(" RK time steps instead of one, starting at exact initial conditions ")),t("mjx-container",g3,[(l(),Q("svg",k3,a[267]||(a[267]=[e(' ',1)]))),a[268]||(a[268]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("mn",null,"0"),t("mo",{stretchy:"false"},")")])],-1))]),a[291]||(a[291]=s(", then ")),t("mjx-container",c3,[(l(),Q("svg",u3,a[269]||(a[269]=[e(' ',1)]))),a[270]||(a[270]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"u"),t("mi",null,"n")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{stretchy:"false"},"("),t("mi",{mathvariant:"normal"},"Δ"),t("msup",null,[t("mi",null,"t"),t("mi",null,"r")]),t("mo",{stretchy:"false"},")")])],-1))]),a[292]||(a[292]=s(" for all ")),t("mjx-container",H3,[(l(),Q("svg",w3,a[271]||(a[271]=[e(' ',1)]))),a[272]||(a[272]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"n"),t("mo",null,"∈"),t("mo",{fence:"false",stretchy:"false"},"{"),t("mn",null,"1"),t("mo",null,","),t("mo",null,"…"),t("mo",null,","),t("mi",null,"N"),t("mo",{fence:"false",stretchy:"false"},"}")])],-1))]),a[293]||(a[293]=s(". Note that for a given ")),t("mjx-container",y3,[(l(),Q("svg",b3,a[273]||(a[273]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D462",d:"M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[274]||(a[274]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u")])],-1))]),a[294]||(a[294]=s(", the corresponding pressure ")),t("mjx-container",x3,[(l(),Q("svg",f3,a[275]||(a[275]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45D",d:"M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z",style:{"stroke-width":"3"}})])])],-1)]))),a[276]||(a[276]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"p")])],-1))]),a[295]||(a[295]=s(" can be calculated to the same accuracy as ")),t("mjx-container",M3,[(l(),Q("svg",L3,a[277]||(a[277]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D462",d:"M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[278]||(a[278]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u")])],-1))]),a[296]||(a[296]=s(" by doing an additional pressure projection after each outer time step ")),t("mjx-container",v3,[(l(),Q("svg",E3,a[279]||(a[279]=[e(' ',1)]))),a[280]||(a[280]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[297]||(a[297]=s(" (if we know ")),t("mjx-container",Z3,[(l(),Q("svg",j3,a[281]||(a[281]=[e(' ',1)]))),a[282]||(a[282]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")])]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")")])],-1))]),a[298]||(a[298]=s("), or to first order accuracy by simply returning ")),t("mjx-container",D3,[(l(),Q("svg",S3,a[283]||(a[283]=[e(' ',1)]))),a[284]||(a[284]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"p"),t("mi",null,"s")])])],-1))]),a[299]||(a[299]=s("."))]),t("p",null,[a[308]||(a[308]=s("Note that each of the sub-step velocities ")),t("mjx-container",V3,[(l(),Q("svg",I3,a[300]||(a[300]=[e(' ',1)]))),a[301]||(a[301]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mi",null,"i")])])],-1))]),a[309]||(a[309]=s(" is divergence free, after projecting the tentative velocities ")),t("mjx-container",R3,[(l(),Q("svg",F3,a[302]||(a[302]=[e(' ',1)]))),a[303]||(a[303]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"v"),t("mi",null,"i")])])],-1))]),a[310]||(a[310]=s(". This is ensured due to the judiciously chosen replacement of ")),t("mjx-container",C3,[(l(),Q("svg",N3,a[304]||(a[304]=[e(' ',1)]))),a[305]||(a[305]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")])]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",{stretchy:"false"},")")])],-1))]),a[311]||(a[311]=s(" with ")),t("mjx-container",K3,[(l(),Q("svg",A3,a[306]||(a[306]=[e(' ',1)]))),a[307]||(a[307]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"/")]),t("mi",{mathvariant:"normal"},"Δ"),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")])])],-1))]),a[312]||(a[312]=s(". The space-discrete divergence-freeness is thus perfectly preserved, even though the time discretization introduces other errors."))]),a[314]||(a[314]=e('Fields
source
',3))]),t("details",B3,[t("summary",null,[a[315]||(a[315]=t("a",{id:"IncompressibleNavierStokes.ImplicitRungeKuttaMethod",href:"#IncompressibleNavierStokes.ImplicitRungeKuttaMethod"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.ImplicitRungeKuttaMethod")],-1)),a[316]||(a[316]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[317]||(a[317]=e('julia struct ImplicitRungeKuttaMethod{T} <: IncompressibleNavierStokes.AbstractRungeKuttaMethod{T}
Implicit Runge Kutta method. See Sanderse [18 ].
The implicit linear system is solved at each time step using Newton's method. The newton_type
may be one of the following:
:no
: Replace iteration matrix with I/Δt (no Jacobian)
:approximate
: Build Jacobian once before iterations only
:full
: Build Jacobian at each iteration
Fields
A
b
c
r
newton_type
maxiter
abstol
reltol
p_add_solve
source
',7))]),t("details",O3,[t("summary",null,[a[318]||(a[318]=t("a",{id:"IncompressibleNavierStokes.RKMethods",href:"#IncompressibleNavierStokes.RKMethods"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods")],-1)),a[319]||(a[319]=s()),i(T,{type:"info",class:"jlObjectType jlModule",text:"Module"})]),a[320]||(a[320]=e('Set up Butcher arrays A
, b
, and c
, as well as and SSP coefficient r
. For families of methods, optional input s
is the number of stages.
Original (MATLAB) by David Ketcheson, extended by Benjamin Sanderse.
Exports
source
',5))]),t("details",P3,[t("summary",null,[a[321]||(a[321]=t("a",{id:"IncompressibleNavierStokes.LMWray3",href:"#IncompressibleNavierStokes.LMWray3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.LMWray3")],-1)),a[322]||(a[322]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[323]||(a[323]=e('julia struct LMWray3{T} <: IncompressibleNavierStokes.AbstractRungeKuttaMethod{T}
Low memory Wray 3rd order scheme. Uses 3 vector fields and one scalar field.
Fields
source
',4))]),a[482]||(a[482]=t("h3",{id:"Explicit-Methods",tabindex:"-1"},[s("Explicit Methods "),t("a",{class:"header-anchor",href:"#Explicit-Methods","aria-label":'Permalink to "Explicit Methods {#Explicit-Methods}"'},"")],-1)),t("details",G3,[t("summary",null,[a[324]||(a[324]=t("a",{id:"IncompressibleNavierStokes.RKMethods.FE11",href:"#IncompressibleNavierStokes.RKMethods.FE11"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.FE11")],-1)),a[325]||(a[325]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[326]||(a[326]=e(`julia FE11 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
FE11 (Forward Euler).
source
`,3))]),t("details",z3,[t("summary",null,[a[327]||(a[327]=t("a",{id:"IncompressibleNavierStokes.RKMethods.SSP22",href:"#IncompressibleNavierStokes.RKMethods.SSP22"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.SSP22")],-1)),a[328]||(a[328]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[329]||(a[329]=e(`julia SSP22 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
SSP22.
source
`,3))]),t("details",J3,[t("summary",null,[a[330]||(a[330]=t("a",{id:"IncompressibleNavierStokes.RKMethods.SSP42",href:"#IncompressibleNavierStokes.RKMethods.SSP42"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.SSP42")],-1)),a[331]||(a[331]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[332]||(a[332]=e(`julia SSP42 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
SSP42.
source
`,3))]),t("details",U3,[t("summary",null,[a[333]||(a[333]=t("a",{id:"IncompressibleNavierStokes.RKMethods.SSP33",href:"#IncompressibleNavierStokes.RKMethods.SSP33"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.SSP33")],-1)),a[334]||(a[334]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[335]||(a[335]=e(`julia SSP33 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
SSP33.
source
`,3))]),t("details",X3,[t("summary",null,[a[336]||(a[336]=t("a",{id:"IncompressibleNavierStokes.RKMethods.SSP43",href:"#IncompressibleNavierStokes.RKMethods.SSP43"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.SSP43")],-1)),a[337]||(a[337]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[338]||(a[338]=e(`julia SSP43 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
SSP43.
source
`,3))]),t("details",W3,[t("summary",null,[a[339]||(a[339]=t("a",{id:"IncompressibleNavierStokes.RKMethods.SSP104",href:"#IncompressibleNavierStokes.RKMethods.SSP104"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.SSP104")],-1)),a[340]||(a[340]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[341]||(a[341]=e(`julia SSP104 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
SSP104.
source
`,3))]),t("details",q3,[t("summary",null,[a[342]||(a[342]=t("a",{id:"IncompressibleNavierStokes.RKMethods.rSSPs2",href:"#IncompressibleNavierStokes.RKMethods.rSSPs2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.rSSPs2")],-1)),a[343]||(a[343]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[344]||(a[344]=e(`julia rSSPs2 (
+;
+ ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
+rSSPs2 (
+ s;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
Rational (optimal, low-storage) s
-stage 2nd order SSP.
source
`,3))]),t("details",$3,[t("summary",null,[a[345]||(a[345]=t("a",{id:"IncompressibleNavierStokes.RKMethods.rSSPs3",href:"#IncompressibleNavierStokes.RKMethods.rSSPs3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.rSSPs3")],-1)),a[346]||(a[346]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[347]||(a[347]=e(`julia rSSPs3 (
+;
+ ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
+rSSPs3 (
+ s;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
Rational (optimal, low-storage) s^2
-stage 3rd order SSP.
source
`,3))]),t("details",Y3,[t("summary",null,[a[348]||(a[348]=t("a",{id:"IncompressibleNavierStokes.RKMethods.Wray3",href:"#IncompressibleNavierStokes.RKMethods.Wray3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.Wray3")],-1)),a[349]||(a[349]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[350]||(a[350]=e(`julia Wray3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Wray's RK3.
source
`,3))]),t("details",_3,[t("summary",null,[a[351]||(a[351]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK56",href:"#IncompressibleNavierStokes.RKMethods.RK56"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK56")],-1)),a[352]||(a[352]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[353]||(a[353]=e(`julia RK56 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RK56.
source
`,3))]),t("details",t4,[t("summary",null,[a[354]||(a[354]=t("a",{id:"IncompressibleNavierStokes.RKMethods.DOPRI6",href:"#IncompressibleNavierStokes.RKMethods.DOPRI6"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.DOPRI6")],-1)),a[355]||(a[355]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[356]||(a[356]=e(`julia DOPRI6 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Dormand-Price pair.
source
`,3))]),a[483]||(a[483]=t("h3",{id:"Implicit-Methods",tabindex:"-1"},[s("Implicit Methods "),t("a",{class:"header-anchor",href:"#Implicit-Methods","aria-label":'Permalink to "Implicit Methods {#Implicit-Methods}"'},"")],-1)),t("details",a4,[t("summary",null,[a[357]||(a[357]=t("a",{id:"IncompressibleNavierStokes.RKMethods.BE11",href:"#IncompressibleNavierStokes.RKMethods.BE11"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.BE11")],-1)),a[358]||(a[358]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[359]||(a[359]=e(`julia BE11 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Backward Euler.
source
`,3))]),t("details",s4,[t("summary",null,[a[360]||(a[360]=t("a",{id:"IncompressibleNavierStokes.RKMethods.SDIRK34",href:"#IncompressibleNavierStokes.RKMethods.SDIRK34"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.SDIRK34")],-1)),a[361]||(a[361]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[362]||(a[362]=e(`julia SDIRK34 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
3-stage, 4th order singly diagonally implicit (SSP).
source
`,3))]),t("details",e4,[t("summary",null,[a[363]||(a[363]=t("a",{id:"IncompressibleNavierStokes.RKMethods.ISSPm2",href:"#IncompressibleNavierStokes.RKMethods.ISSPm2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.ISSPm2")],-1)),a[364]||(a[364]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[365]||(a[365]=e(`julia ISSPm2 (
+;
+ ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
+ISSPm2 (
+ s;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
Optimal DIRK SSP schemes of order 2.
source
`,3))]),t("details",Q4,[t("summary",null,[a[366]||(a[366]=t("a",{id:"IncompressibleNavierStokes.RKMethods.ISSPs3",href:"#IncompressibleNavierStokes.RKMethods.ISSPs3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.ISSPs3")],-1)),a[367]||(a[367]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[368]||(a[368]=e(`julia ISSPs3 (
+;
+ ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
+ISSPs3 (
+ s;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
Optimal DIRK SSP schemes of order 3.
source
`,3))]),a[484]||(a[484]=t("h3",{id:"Half-explicit-methods",tabindex:"-1"},[s("Half explicit methods "),t("a",{class:"header-anchor",href:"#Half-explicit-methods","aria-label":'Permalink to "Half explicit methods {#Half-explicit-methods}"'},"")],-1)),t("details",l4,[t("summary",null,[a[369]||(a[369]=t("a",{id:"IncompressibleNavierStokes.RKMethods.HEM3",href:"#IncompressibleNavierStokes.RKMethods.HEM3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.HEM3")],-1)),a[370]||(a[370]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[371]||(a[371]=e(`julia HEM3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Brasey and Hairer.
source
`,3))]),t("details",T4,[t("summary",null,[a[372]||(a[372]=t("a",{id:"IncompressibleNavierStokes.RKMethods.HEM3BS",href:"#IncompressibleNavierStokes.RKMethods.HEM3BS"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.HEM3BS")],-1)),a[373]||(a[373]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[374]||(a[374]=e(`julia HEM3BS (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
HEM3BS.
source
`,3))]),t("details",i4,[t("summary",null,[a[375]||(a[375]=t("a",{id:"IncompressibleNavierStokes.RKMethods.HEM5",href:"#IncompressibleNavierStokes.RKMethods.HEM5"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.HEM5")],-1)),a[376]||(a[376]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[377]||(a[377]=e(`julia HEM5 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Brasey and Hairer, 5 stage, 4th order.
source
`,3))]),a[485]||(a[485]=t("h3",{id:"Classical-Methods",tabindex:"-1"},[s("Classical Methods "),t("a",{class:"header-anchor",href:"#Classical-Methods","aria-label":'Permalink to "Classical Methods {#Classical-Methods}"'},"")],-1)),t("details",n4,[t("summary",null,[a[378]||(a[378]=t("a",{id:"IncompressibleNavierStokes.RKMethods.GL1",href:"#IncompressibleNavierStokes.RKMethods.GL1"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.GL1")],-1)),a[379]||(a[379]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[380]||(a[380]=e(`julia GL1 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
GL1.
source
`,3))]),t("details",o4,[t("summary",null,[a[381]||(a[381]=t("a",{id:"IncompressibleNavierStokes.RKMethods.GL2",href:"#IncompressibleNavierStokes.RKMethods.GL2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.GL2")],-1)),a[382]||(a[382]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[383]||(a[383]=e(`julia GL2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
GL2.
source
`,3))]),t("details",r4,[t("summary",null,[a[384]||(a[384]=t("a",{id:"IncompressibleNavierStokes.RKMethods.GL3",href:"#IncompressibleNavierStokes.RKMethods.GL3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.GL3")],-1)),a[385]||(a[385]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[386]||(a[386]=e(`julia GL3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
GL3.
source
`,3))]),t("details",d4,[t("summary",null,[a[387]||(a[387]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RIA1",href:"#IncompressibleNavierStokes.RKMethods.RIA1"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RIA1")],-1)),a[388]||(a[388]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[389]||(a[389]=e(`julia RIA1 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
This is implicit Euler.
source
`,3))]),t("details",m4,[t("summary",null,[a[390]||(a[390]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RIA2",href:"#IncompressibleNavierStokes.RKMethods.RIA2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RIA2")],-1)),a[391]||(a[391]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[392]||(a[392]=e(`julia RIA2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RIA2.
source
`,3))]),t("details",p4,[t("summary",null,[a[393]||(a[393]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RIA3",href:"#IncompressibleNavierStokes.RKMethods.RIA3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RIA3")],-1)),a[394]||(a[394]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[395]||(a[395]=e(`julia RIA3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RIA3.
source
`,3))]),t("details",h4,[t("summary",null,[a[396]||(a[396]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RIIA1",href:"#IncompressibleNavierStokes.RKMethods.RIIA1"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RIIA1")],-1)),a[397]||(a[397]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[398]||(a[398]=e(`julia RIIA1 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RIIA1.
source
`,3))]),t("details",g4,[t("summary",null,[a[399]||(a[399]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RIIA2",href:"#IncompressibleNavierStokes.RKMethods.RIIA2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RIIA2")],-1)),a[400]||(a[400]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[401]||(a[401]=e(`julia RIIA2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RIIA2.
source
`,3))]),t("details",k4,[t("summary",null,[a[402]||(a[402]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RIIA3",href:"#IncompressibleNavierStokes.RKMethods.RIIA3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RIIA3")],-1)),a[403]||(a[403]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[404]||(a[404]=e(`julia RIIA3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RIIA3.
source
`,3))]),t("details",c4,[t("summary",null,[a[405]||(a[405]=t("a",{id:"IncompressibleNavierStokes.RKMethods.LIIIA2",href:"#IncompressibleNavierStokes.RKMethods.LIIIA2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.LIIIA2")],-1)),a[406]||(a[406]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[407]||(a[407]=e(`julia LIIIA2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
LIIIA2.
source
`,3))]),t("details",u4,[t("summary",null,[a[408]||(a[408]=t("a",{id:"IncompressibleNavierStokes.RKMethods.LIIIA3",href:"#IncompressibleNavierStokes.RKMethods.LIIIA3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.LIIIA3")],-1)),a[409]||(a[409]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[410]||(a[410]=e(`julia LIIIA3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
LIIIA3.
source
`,3))]),a[486]||(a[486]=t("h3",{id:"Chebyshev-methods",tabindex:"-1"},[s("Chebyshev methods "),t("a",{class:"header-anchor",href:"#Chebyshev-methods","aria-label":'Permalink to "Chebyshev methods {#Chebyshev-methods}"'},"")],-1)),t("details",H4,[t("summary",null,[a[411]||(a[411]=t("a",{id:"IncompressibleNavierStokes.RKMethods.CHDIRK3",href:"#IncompressibleNavierStokes.RKMethods.CHDIRK3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.CHDIRK3")],-1)),a[412]||(a[412]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[413]||(a[413]=e(`julia CHDIRK3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Chebyshev based DIRK (not algebraically stable).
source
`,3))]),t("details",w4,[t("summary",null,[a[414]||(a[414]=t("a",{id:"IncompressibleNavierStokes.RKMethods.CHCONS3",href:"#IncompressibleNavierStokes.RKMethods.CHCONS3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.CHCONS3")],-1)),a[415]||(a[415]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[416]||(a[416]=e(`julia CHCONS3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
CHCONS3.
source
`,3))]),t("details",y4,[t("summary",null,[a[417]||(a[417]=t("a",{id:"IncompressibleNavierStokes.RKMethods.CHC3",href:"#IncompressibleNavierStokes.RKMethods.CHC3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.CHC3")],-1)),a[418]||(a[418]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[419]||(a[419]=e(`julia CHC3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Chebyshev quadrature and C(3) satisfied. Note this equals Lobatto IIIA.
source
`,3))]),t("details",b4,[t("summary",null,[a[420]||(a[420]=t("a",{id:"IncompressibleNavierStokes.RKMethods.CHC5",href:"#IncompressibleNavierStokes.RKMethods.CHC5"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.CHC5")],-1)),a[421]||(a[421]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[422]||(a[422]=e(`julia CHC5 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
CHC5.
source
`,3))]),a[487]||(a[487]=t("h3",{id:"Miscellaneous-Methods",tabindex:"-1"},[s("Miscellaneous Methods "),t("a",{class:"header-anchor",href:"#Miscellaneous-Methods","aria-label":'Permalink to "Miscellaneous Methods {#Miscellaneous-Methods}"'},"")],-1)),t("details",x4,[t("summary",null,[a[423]||(a[423]=t("a",{id:"IncompressibleNavierStokes.RKMethods.Mid22",href:"#IncompressibleNavierStokes.RKMethods.Mid22"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.Mid22")],-1)),a[424]||(a[424]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[425]||(a[425]=e(`julia Mid22 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Midpoint 22 method.
source
`,3))]),t("details",f4,[t("summary",null,[a[426]||(a[426]=t("a",{id:"IncompressibleNavierStokes.RKMethods.MTE22",href:"#IncompressibleNavierStokes.RKMethods.MTE22"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.MTE22")],-1)),a[427]||(a[427]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[428]||(a[428]=e(`julia MTE22 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Minimal truncation error 22 method (Heun).
source
`,3))]),t("details",M4,[t("summary",null,[a[429]||(a[429]=t("a",{id:"IncompressibleNavierStokes.RKMethods.CN22",href:"#IncompressibleNavierStokes.RKMethods.CN22"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.CN22")],-1)),a[430]||(a[430]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[431]||(a[431]=e(`julia CN22 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Crank-Nicholson.
source
`,3))]),t("details",L4,[t("summary",null,[a[432]||(a[432]=t("a",{id:"IncompressibleNavierStokes.RKMethods.Heun33",href:"#IncompressibleNavierStokes.RKMethods.Heun33"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.Heun33")],-1)),a[433]||(a[433]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[434]||(a[434]=e(`julia Heun33 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Heun33.
source
`,3))]),t("details",v4,[t("summary",null,[a[435]||(a[435]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK33C2",href:"#IncompressibleNavierStokes.RKMethods.RK33C2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK33C2")],-1)),a[436]||(a[436]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[437]||(a[437]=e(`julia RK33C2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RK3 satisfying C(2) for i=3.
source
`,3))]),t("details",E4,[t("summary",null,[a[438]||(a[438]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK33P2",href:"#IncompressibleNavierStokes.RKMethods.RK33P2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK33P2")],-1)),a[439]||(a[439]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[440]||(a[440]=e(`julia RK33P2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RK3 satisfying the second order condition for the pressure.
source
`,3))]),t("details",Z4,[t("summary",null,[a[441]||(a[441]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK44",href:"#IncompressibleNavierStokes.RKMethods.RK44"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK44")],-1)),a[442]||(a[442]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[443]||(a[443]=e(`julia RK44 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Classical fourth order.
source
`,3))]),t("details",j4,[t("summary",null,[a[444]||(a[444]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK44C2",href:"#IncompressibleNavierStokes.RKMethods.RK44C2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK44C2")],-1)),a[445]||(a[445]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[446]||(a[446]=e(`julia RK44C2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RK4 satisfying C(2) for i=3.
source
`,3))]),t("details",D4,[t("summary",null,[a[447]||(a[447]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK44C23",href:"#IncompressibleNavierStokes.RKMethods.RK44C23"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK44C23")],-1)),a[448]||(a[448]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[449]||(a[449]=e(`julia RK44C23 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RK4 satisfying C(2) for i=3 and c2=c3.
source
`,3))]),t("details",S4,[t("summary",null,[a[450]||(a[450]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK44P2",href:"#IncompressibleNavierStokes.RKMethods.RK44P2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK44P2")],-1)),a[451]||(a[451]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[452]||(a[452]=e(`julia RK44P2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RK4 satisfying the second order condition for the pressure (but not third order).
source
`,3))]),a[488]||(a[488]=t("h3",{id:"DSRK-Methods",tabindex:"-1"},[s("DSRK Methods "),t("a",{class:"header-anchor",href:"#DSRK-Methods","aria-label":'Permalink to "DSRK Methods {#DSRK-Methods}"'},"")],-1)),t("details",V4,[t("summary",null,[a[453]||(a[453]=t("a",{id:"IncompressibleNavierStokes.RKMethods.DSso2",href:"#IncompressibleNavierStokes.RKMethods.DSso2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.DSso2")],-1)),a[454]||(a[454]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[455]||(a[455]=e(`julia DSso2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
CBM's DSRKso2.
source
`,3))]),t("details",I4,[t("summary",null,[a[456]||(a[456]=t("a",{id:"IncompressibleNavierStokes.RKMethods.DSRK2",href:"#IncompressibleNavierStokes.RKMethods.DSRK2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.DSRK2")],-1)),a[457]||(a[457]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[458]||(a[458]=e(`julia DSRK2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
CBM's DSRK2.
source
`,3))]),t("details",R4,[t("summary",null,[a[459]||(a[459]=t("a",{id:"IncompressibleNavierStokes.RKMethods.DSRK3",href:"#IncompressibleNavierStokes.RKMethods.DSRK3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.DSRK3")],-1)),a[460]||(a[460]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[461]||(a[461]=e(`julia DSRK3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Zennaro's DSRK3.
source
`,3))]),a[489]||(a[489]=t("h3",{id:"Non-SSP-Methods-of-Wong-and-Spiteri",tabindex:"-1"},[s('"Non-SSP" Methods of Wong & Spiteri '),t("a",{class:"header-anchor",href:"#Non-SSP-Methods-of-Wong-and-Spiteri","aria-label":'Permalink to ""Non-SSP" Methods of Wong & Spiteri {#"Non-SSP"-Methods-of-Wong-and-Spiteri}"'},"")],-1)),t("details",F4,[t("summary",null,[a[462]||(a[462]=t("a",{id:"IncompressibleNavierStokes.RKMethods.NSSP21",href:"#IncompressibleNavierStokes.RKMethods.NSSP21"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.NSSP21")],-1)),a[463]||(a[463]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[464]||(a[464]=e(`julia NSSP21 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
NSSP21.
source
`,3))]),t("details",C4,[t("summary",null,[a[465]||(a[465]=t("a",{id:"IncompressibleNavierStokes.RKMethods.NSSP32",href:"#IncompressibleNavierStokes.RKMethods.NSSP32"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.NSSP32")],-1)),a[466]||(a[466]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[467]||(a[467]=e(`julia NSSP32 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
NSSP32.
source
`,3))]),t("details",N4,[t("summary",null,[a[468]||(a[468]=t("a",{id:"IncompressibleNavierStokes.RKMethods.NSSP33",href:"#IncompressibleNavierStokes.RKMethods.NSSP33"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.NSSP33")],-1)),a[469]||(a[469]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[470]||(a[470]=e(`julia NSSP33 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
NSSP33.
source
`,3))]),t("details",K4,[t("summary",null,[a[471]||(a[471]=t("a",{id:"IncompressibleNavierStokes.RKMethods.NSSP53",href:"#IncompressibleNavierStokes.RKMethods.NSSP53"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.NSSP53")],-1)),a[472]||(a[472]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[473]||(a[473]=e(`julia NSSP53 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
NSSP53.
source
`,3))])])}const X4=n(r,[["render",A4]]);export{U4 as __pageData,X4 as default};
diff --git a/previews/PR126/assets/manual_time.md.DY8-Hmku.lean.js b/previews/PR126/assets/manual_time.md.DY8-Hmku.lean.js
new file mode 100644
index 00000000..10dbc6a7
--- /dev/null
+++ b/previews/PR126/assets/manual_time.md.DY8-Hmku.lean.js
@@ -0,0 +1,174 @@
+import{_ as n,c as Q,j as t,a as s,a5 as e,G as i,B as o,o as l}from"./chunks/framework.BSoZtefh.js";const U4=JSON.parse('{"title":"Time discretization","description":"","frontmatter":{},"headers":[],"relativePath":"manual/time.md","filePath":"manual/time.md","lastUpdated":null}'),r={name:"manual/time.md"},d={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},m={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"25.898ex",height:"4.676ex",role:"img",focusable:"false",viewBox:"0 -1370 11446.9 2067","aria-hidden":"true"},p={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},h={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.464ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.193ex",height:"2.009ex",role:"img",focusable:"false",viewBox:"0 -683 6273.2 888","aria-hidden":"true"},g={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.991ex",height:"3.006ex",role:"img",focusable:"false",viewBox:"0 -975.7 1763.8 1328.5","aria-hidden":"true"},c={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.871ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 1711 1000","aria-hidden":"true"},H={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"4.988ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2204.7 1000","aria-hidden":"true"},y={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"1.593ex",height:"1.532ex",role:"img",focusable:"false",viewBox:"0 -677 704 677","aria-hidden":"true"},x={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"0"},xmlns:"http://www.w3.org/2000/svg",width:"2.009ex",height:"1.545ex",role:"img",focusable:"false",viewBox:"0 -683 888 683","aria-hidden":"true"},M={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},L={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.237ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 3640.9 1083.9","aria-hidden":"true"},v={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.452ex",height:"1.984ex",role:"img",focusable:"false",viewBox:"0 -683 7272 877","aria-hidden":"true"},Z={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.953ex",height:"2.072ex",role:"img",focusable:"false",viewBox:"0 -833.9 2631.1 915.9","aria-hidden":"true"},D={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.035ex",height:"2.099ex",role:"img",focusable:"false",viewBox:"0 -846 3109.5 928","aria-hidden":"true"},V={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.186ex"},xmlns:"http://www.w3.org/2000/svg",width:"15.605ex",height:"2.072ex",role:"img",focusable:"false",viewBox:"0 -833.9 6897.5 915.9","aria-hidden":"true"},R={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.478ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4631.1 1000","aria-hidden":"true"},C={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.019ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 2218.3 1000","aria-hidden":"true"},K={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.484ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 4192.1 1083.9","aria-hidden":"true"},B={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},O={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.442ex",height:"1.553ex",role:"img",focusable:"false",viewBox:"0 -675.5 1079.3 686.5","aria-hidden":"true"},P={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},G={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.02ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 451 453","aria-hidden":"true"},z={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},J={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.415ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 9023.4 1000","aria-hidden":"true"},U={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.357ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 600 453","aria-hidden":"true"},W={class:"jldocstring custom-block",open:""},q={class:"jldocstring custom-block",open:""},$={class:"jldocstring custom-block",open:""},Y={class:"jldocstring custom-block",open:""},_={class:"jldocstring custom-block",open:""},t1={class:"jldocstring custom-block",open:""},a1={class:"jldocstring custom-block",open:""},s1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},e1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.701ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -716 1194 727","aria-hidden":"true"},Q1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},l1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.158ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4489.7 1000","aria-hidden":"true"},T1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},i1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.804ex",height:"1.791ex",role:"img",focusable:"false",viewBox:"0 -626 797.6 791.6","aria-hidden":"true"},n1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},o1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"16.869ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 7456.2 1000","aria-hidden":"true"},r1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},d1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.471ex"},xmlns:"http://www.w3.org/2000/svg",width:"13.338ex",height:"2.09ex",role:"img",focusable:"false",viewBox:"0 -716 5895.2 924","aria-hidden":"true"},m1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},p1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},h1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.105ex",height:"1.994ex",role:"img",focusable:"false",viewBox:"0 -716 4908.6 881.6","aria-hidden":"true"},k1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},c1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-6.059ex"},xmlns:"http://www.w3.org/2000/svg",width:"48.012ex",height:"13.249ex",role:"img",focusable:"false",viewBox:"0 -3178 21221.3 5856","aria-hidden":"true"},u1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},H1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"8.353ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 3692.2 1000","aria-hidden":"true"},w1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},y1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.781ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.874ex",height:"2.737ex",role:"img",focusable:"false",viewBox:"0 -864.9 2596.1 1209.9","aria-hidden":"true"},b1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},x1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.791ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.329ex",height:"2.748ex",role:"img",focusable:"false",viewBox:"0 -864.9 8985.2 1214.4","aria-hidden":"true"},f1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},M1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.097ex",height:"1.027ex",role:"img",focusable:"false",viewBox:"0 -443 485 454","aria-hidden":"true"},L1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},v1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.097ex",height:"1.027ex",role:"img",focusable:"false",viewBox:"0 -443 485 454","aria-hidden":"true"},E1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},Z1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-8.031ex"},xmlns:"http://www.w3.org/2000/svg",width:"53.662ex",height:"17.192ex",role:"img",focusable:"false",viewBox:"0 -4049.5 23718.8 7599","aria-hidden":"true"},j1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},D1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.097ex",height:"1.027ex",role:"img",focusable:"false",viewBox:"0 -443 485 454","aria-hidden":"true"},S1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},V1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.801ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.818ex",height:"2.758ex",role:"img",focusable:"false",viewBox:"0 -864.9 5223.7 1219","aria-hidden":"true"},I1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},R1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.701ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -716 1194 727","aria-hidden":"true"},F1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},C1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.023ex",height:"2.059ex",role:"img",focusable:"false",viewBox:"0 -716 1336 910","aria-hidden":"true"},N1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},K1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"46.661ex",height:"4.88ex",role:"img",focusable:"false",viewBox:"0 -1460 20624.2 2157","aria-hidden":"true"},A1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},B1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},O1={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},P1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"34.846ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 15402 1000","aria-hidden":"true"},G1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},z1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.069ex",height:"2.059ex",role:"img",focusable:"false",viewBox:"0 -716 5334.6 910","aria-hidden":"true"},J1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},U1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.138ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 503 636","aria-hidden":"true"},X1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},W1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},q1={class:"jldocstring custom-block",open:""},$1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Y1={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.701ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -716 1194 727","aria-hidden":"true"},_1={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},t2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.375ex",role:"img",focusable:"false",viewBox:"0 -442 1008.6 607.6","aria-hidden":"true"},a2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},s2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.126ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 939.6 636","aria-hidden":"true"},e2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.804ex",height:"1.791ex",role:"img",focusable:"false",viewBox:"0 -626 797.6 791.6","aria-hidden":"true"},l2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.471ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.526ex",height:"1.471ex",role:"img",focusable:"false",viewBox:"0 -442 1558.7 650","aria-hidden":"true"},i2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},n2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.471ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.37ex",height:"1.471ex",role:"img",focusable:"false",viewBox:"0 -442 1489.7 650","aria-hidden":"true"},o2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.471ex"},xmlns:"http://www.w3.org/2000/svg",width:"13.338ex",height:"2.09ex",role:"img",focusable:"false",viewBox:"0 -716 5895.2 924","aria-hidden":"true"},d2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.513ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 9066.7 1000","aria-hidden":"true"},p2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.287ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 9408.7 1000","aria-hidden":"true"},g2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.781ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.093ex",height:"2.737ex",role:"img",focusable:"false",viewBox:"0 -864.9 2693.1 1209.9","aria-hidden":"true"},c2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.097ex",height:"1.724ex",role:"img",focusable:"false",viewBox:"0 -751 485 762","aria-hidden":"true"},H2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},w2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.647ex"},xmlns:"http://www.w3.org/2000/svg",width:"65.933ex",height:"5.926ex",role:"img",focusable:"false",viewBox:"0 -1449.5 29142.5 2619.4","aria-hidden":"true"},y2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"3.023ex",height:"2.059ex",role:"img",focusable:"false",viewBox:"0 -716 1336 910","aria-hidden":"true"},x2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},f2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.577ex"},xmlns:"http://www.w3.org/2000/svg",width:"30.973ex",height:"5.355ex",role:"img",focusable:"false",viewBox:"0 -1669.9 13690.2 2366.9","aria-hidden":"true"},M2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},L2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-2.647ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.441ex",height:"5.796ex",role:"img",focusable:"false",viewBox:"0 -1392 9035 2561.9","aria-hidden":"true"},v2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},E2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-1.602ex"},xmlns:"http://www.w3.org/2000/svg",width:"22.092ex",height:"4.663ex",role:"img",focusable:"false",viewBox:"0 -1353 9764.7 2061","aria-hidden":"true"},Z2={class:"jldocstring custom-block",open:""},j2={class:"jldocstring custom-block",open:""},D2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.282ex",height:"1.375ex",role:"img",focusable:"false",viewBox:"0 -442 1008.6 607.6","aria-hidden":"true"},V2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.804ex",height:"1.791ex",role:"img",focusable:"false",viewBox:"0 -626 797.6 791.6","aria-hidden":"true"},R2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.105ex",height:"1.994ex",role:"img",focusable:"false",viewBox:"0 -716 4908.6 881.6","aria-hidden":"true"},C2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.023ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.061ex",height:"1.023ex",role:"img",focusable:"false",viewBox:"0 -442 469 452","aria-hidden":"true"},K2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.375ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.585ex",height:"1.994ex",role:"img",focusable:"false",viewBox:"0 -716 5562.5 881.6","aria-hidden":"true"},B2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},O2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.879ex",height:"1.977ex",role:"img",focusable:"false",viewBox:"0 -716 4808.5 873.8","aria-hidden":"true"},P2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},G2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.355ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.358ex",height:"1.975ex",role:"img",focusable:"false",viewBox:"0 -716 4136.2 873.1","aria-hidden":"true"},z2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},J2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.355ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.589ex",height:"1.772ex",role:"img",focusable:"false",viewBox:"0 -626 2470.2 783.1","aria-hidden":"true"},U2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},X2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"11.031ex",height:"1.946ex",role:"img",focusable:"false",viewBox:"0 -666 4875.6 860","aria-hidden":"true"},W2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},q2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.034ex",height:"1.357ex",role:"img",focusable:"false",viewBox:"0 -442 899 599.8","aria-hidden":"true"},$2={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Y2={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.878ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 830 636","aria-hidden":"true"},_2={class:"MathJax",jax:"SVG",display:"true",style:{direction:"ltr",display:"block","text-align":"center",margin:"1em 0",position:"relative"}},t3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-15.831ex"},xmlns:"http://www.w3.org/2000/svg",width:"44.276ex",height:"32.793ex",role:"img",focusable:"false",viewBox:"0 -7497.2 19570.1 14494.3","aria-hidden":"true"},a3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},s3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.666ex"},xmlns:"http://www.w3.org/2000/svg",width:"5.755ex",height:"2.363ex",role:"img",focusable:"false",viewBox:"0 -750 2543.6 1044.2","aria-hidden":"true"},e3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},Q3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.972ex"},xmlns:"http://www.w3.org/2000/svg",width:"12.99ex",height:"3.109ex",role:"img",focusable:"false",viewBox:"0 -944.5 5741.5 1374.1","aria-hidden":"true"},l3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},T3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.355ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.232ex",height:"1.355ex",role:"img",focusable:"false",viewBox:"0 -442 986.6 599.1","aria-hidden":"true"},i3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},n3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"10.158ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 4489.7 1000","aria-hidden":"true"},o3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},r3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.102ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 9327.2 1083.9","aria-hidden":"true"},d3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},m3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.02ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 451 453","aria-hidden":"true"},p3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},h3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.357ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 600 453","aria-hidden":"true"},g3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},k3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"9.484ex",height:"2.452ex",role:"img",focusable:"false",viewBox:"0 -833.9 4192.1 1083.9","aria-hidden":"true"},c3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},u3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"20.415ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 9023.4 1000","aria-hidden":"true"},H3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},w3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"14.567ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 6438.6 1000","aria-hidden":"true"},y3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},b3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},x3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},f3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.138ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 503 636","aria-hidden":"true"},M3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},L3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.294ex",height:"1.025ex",role:"img",focusable:"false",viewBox:"0 -442 572 453","aria-hidden":"true"},v3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},E3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.025ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.701ex",height:"1.645ex",role:"img",focusable:"false",viewBox:"0 -716 1194 727","aria-hidden":"true"},Z3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},j3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.567ex",height:"3.006ex",role:"img",focusable:"false",viewBox:"0 -975.7 2902.8 1328.5","aria-hidden":"true"},D3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},S3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.439ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.076ex",height:"1.439ex",role:"img",focusable:"false",viewBox:"0 -442 917.6 636","aria-hidden":"true"},V3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},I3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"2.034ex",height:"1.357ex",role:"img",focusable:"false",viewBox:"0 -442 899 599.8","aria-hidden":"true"},R3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},F3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.357ex"},xmlns:"http://www.w3.org/2000/svg",width:"1.837ex",height:"1.359ex",role:"img",focusable:"false",viewBox:"0 -443 812 600.8","aria-hidden":"true"},C3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},N3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.798ex"},xmlns:"http://www.w3.org/2000/svg",width:"7.307ex",height:"3.006ex",role:"img",focusable:"false",viewBox:"0 -975.7 3229.8 1328.5","aria-hidden":"true"},K3={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},A3={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.566ex"},xmlns:"http://www.w3.org/2000/svg",width:"21.935ex",height:"2.262ex",role:"img",focusable:"false",viewBox:"0 -750 9695.2 1000","aria-hidden":"true"},B3={class:"jldocstring custom-block",open:""},O3={class:"jldocstring custom-block",open:""},P3={class:"jldocstring custom-block",open:""},G3={class:"jldocstring custom-block",open:""},z3={class:"jldocstring custom-block",open:""},J3={class:"jldocstring custom-block",open:""},U3={class:"jldocstring custom-block",open:""},X3={class:"jldocstring custom-block",open:""},W3={class:"jldocstring custom-block",open:""},q3={class:"jldocstring custom-block",open:""},$3={class:"jldocstring custom-block",open:""},Y3={class:"jldocstring custom-block",open:""},_3={class:"jldocstring custom-block",open:""},t4={class:"jldocstring custom-block",open:""},a4={class:"jldocstring custom-block",open:""},s4={class:"jldocstring custom-block",open:""},e4={class:"jldocstring custom-block",open:""},Q4={class:"jldocstring custom-block",open:""},l4={class:"jldocstring custom-block",open:""},T4={class:"jldocstring custom-block",open:""},i4={class:"jldocstring custom-block",open:""},n4={class:"jldocstring custom-block",open:""},o4={class:"jldocstring custom-block",open:""},r4={class:"jldocstring custom-block",open:""},d4={class:"jldocstring custom-block",open:""},m4={class:"jldocstring custom-block",open:""},p4={class:"jldocstring custom-block",open:""},h4={class:"jldocstring custom-block",open:""},g4={class:"jldocstring custom-block",open:""},k4={class:"jldocstring custom-block",open:""},c4={class:"jldocstring custom-block",open:""},u4={class:"jldocstring custom-block",open:""},H4={class:"jldocstring custom-block",open:""},w4={class:"jldocstring custom-block",open:""},y4={class:"jldocstring custom-block",open:""},b4={class:"jldocstring custom-block",open:""},x4={class:"jldocstring custom-block",open:""},f4={class:"jldocstring custom-block",open:""},M4={class:"jldocstring custom-block",open:""},L4={class:"jldocstring custom-block",open:""},v4={class:"jldocstring custom-block",open:""},E4={class:"jldocstring custom-block",open:""},Z4={class:"jldocstring custom-block",open:""},j4={class:"jldocstring custom-block",open:""},D4={class:"jldocstring custom-block",open:""},S4={class:"jldocstring custom-block",open:""},V4={class:"jldocstring custom-block",open:""},I4={class:"jldocstring custom-block",open:""},R4={class:"jldocstring custom-block",open:""},F4={class:"jldocstring custom-block",open:""},C4={class:"jldocstring custom-block",open:""},N4={class:"jldocstring custom-block",open:""},K4={class:"jldocstring custom-block",open:""};function A4(B4,a,O4,P4,G4,z4){const T=o("Badge");return l(),Q("div",null,[a[474]||(a[474]=t("h1",{id:"Time-discretization",tabindex:"-1"},[s("Time discretization "),t("a",{class:"header-anchor",href:"#Time-discretization","aria-label":'Permalink to "Time discretization {#Time-discretization}"'},"")],-1)),a[475]||(a[475]=t("p",null,"The spatially discretized Navier-Stokes equations form a differential-algebraic system, with an ODE for the velocity",-1)),t("mjx-container",d,[(l(),Q("svg",m,a[0]||(a[0]=[e(' ',1)]))),a[1]||(a[1]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"u")]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])]),t("mo",null,"="),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mi",null,"u"),t("mo",null,","),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("mi",null,"G"),t("mi",null,"p"),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},")")])],-1))]),a[476]||(a[476]=t("p",null,"subject to the algebraic constraint formed by the mass equation",-1)),t("mjx-container",p,[(l(),Q("svg",h,a[2]||(a[2]=[e(' ',1)]))),a[3]||(a[3]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"M"),t("mi",null,"u"),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",null,"="),t("mn",null,"0.")])],-1))]),t("p",null,[a[8]||(a[8]=s("In the end of the previous section, we differentiated the mass equation in time to obtain a discrete pressure Poisson equation. This equation includes the term ")),t("mjx-container",g,[(l(),Q("svg",k,a[4]||(a[4]=[e(' ',1)]))),a[5]||(a[5]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")])]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])])])],-1))]),a[9]||(a[9]=s(", which is non-zero if an unsteady flow of mass is added to the domain (Dirichlet boundary conditions). This term ensures that the time-continuous discrete velocity field ")),t("mjx-container",c,[(l(),Q("svg",u,a[6]||(a[6]=[e(' ',1)]))),a[7]||(a[7]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")")])],-1))]),a[10]||(a[10]=s(" stays divergence free (conserves mass). However, if we directly discretize this system in time, the mass preservation may actually not be respected. For this, we will change the definition of the pressure such that the time-discretized velocity field is divergence free at each time step and each time sub-step (to be defined in the following)."))]),t("p",null,[a[41]||(a[41]=s("Consider the interval ")),t("mjx-container",H,[(l(),Q("svg",w,a[11]||(a[11]=[e(' ',1)]))),a[12]||(a[12]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"["),t("mn",null,"0"),t("mo",null,","),t("mi",null,"T"),t("mo",{stretchy:"false"},"]")])],-1))]),a[42]||(a[42]=s(" for some simulation time ")),t("mjx-container",y,[(l(),Q("svg",b,a[13]||(a[13]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D447",d:"M40 437Q21 437 21 445Q21 450 37 501T71 602L88 651Q93 669 101 677H569H659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437Q640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631Q469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46Q418 46 427 45T436 36Q436 31 433 22Q429 4 424 1L422 0Q419 0 415 0Q410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83H94Q174 46 189 55Q190 56 191 56Q196 59 201 76T241 233Q258 301 269 344Q339 619 339 625Q339 630 310 630H279Q212 630 191 624Q146 614 121 583T67 467Q60 445 57 441T43 437H40Z",style:{"stroke-width":"3"}})])])],-1)]))),a[14]||(a[14]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"T")])],-1))]),a[43]||(a[43]=s(". We will divide it into ")),t("mjx-container",x,[(l(),Q("svg",f,a[15]||(a[15]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D441",d:"M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z",style:{"stroke-width":"3"}})])])],-1)]))),a[16]||(a[16]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"N")])],-1))]),a[44]||(a[44]=s(" sub-intervals ")),t("mjx-container",M,[(l(),Q("svg",L,a[17]||(a[17]=[e(' ',1)]))),a[18]||(a[18]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"["),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")]),t("mo",null,","),t("msup",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"n"),t("mo",null,"+"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},"]")])],-1))]),a[45]||(a[45]=s(" for ")),t("mjx-container",v,[(l(),Q("svg",E,a[19]||(a[19]=[e(' ',1)]))),a[20]||(a[20]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"n"),t("mo",null,"="),t("mn",null,"0"),t("mo",null,","),t("mo",null,"…"),t("mo",null,","),t("mi",null,"N"),t("mo",null,"−"),t("mn",null,"1")])],-1))]),a[46]||(a[46]=s(", with ")),t("mjx-container",Z,[(l(),Q("svg",j,a[21]||(a[21]=[e(' ',1)]))),a[22]||(a[22]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"="),t("mn",null,"0")])],-1))]),a[47]||(a[47]=s(", ")),t("mjx-container",D,[(l(),Q("svg",S,a[23]||(a[23]=[e(' ',1)]))),a[24]||(a[24]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"t"),t("mi",null,"N")]),t("mo",null,"="),t("mi",null,"T")])],-1))]),a[48]||(a[48]=s(", and increment ")),t("mjx-container",V,[(l(),Q("svg",I,a[25]||(a[25]=[e(' ',1)]))),a[26]||(a[26]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")]),t("mo",null,"="),t("msup",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"n"),t("mo",null,"+"),t("mn",null,"1")])]),t("mo",null,"−"),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")])])],-1))]),a[49]||(a[49]=s(". We define ")),t("mjx-container",R,[(l(),Q("svg",F,a[27]||(a[27]=[e(' ',1)]))),a[28]||(a[28]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"u"),t("mi",null,"n")]),t("mo",null,"≈"),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")]),t("mo",{stretchy:"false"},")")])],-1))]),a[50]||(a[50]=s(" as an approximation to the exact discrete velocity field ")),t("mjx-container",C,[(l(),Q("svg",N,a[29]||(a[29]=[e(' ',1)]))),a[30]||(a[30]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")]),t("mo",{stretchy:"false"},")")])],-1))]),a[51]||(a[51]=s(", with ")),t("mjx-container",K,[(l(),Q("svg",A,a[31]||(a[31]=[e(' ',1)]))),a[32]||(a[32]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("mn",null,"0"),t("mo",{stretchy:"false"},")")])],-1))]),a[52]||(a[52]=s(" starting from the exact initial conditions. We say that the time integration scheme (definition of ")),t("mjx-container",B,[(l(),Q("svg",O,a[33]||(a[33]=[e(' ',1)]))),a[34]||(a[34]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"u"),t("mi",null,"n")])])],-1))]),a[53]||(a[53]=s(") is accurate to the order ")),t("mjx-container",P,[(l(),Q("svg",G,a[35]||(a[35]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45F",d:"M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[36]||(a[36]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"r")])],-1))]),a[54]||(a[54]=s(" if ")),t("mjx-container",z,[(l(),Q("svg",J,a[37]||(a[37]=[e(' ',1)]))),a[38]||(a[38]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"u"),t("mi",null,"n")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{stretchy:"false"},"("),t("mi",{mathvariant:"normal"},"Δ"),t("msup",null,[t("mi",null,"t"),t("mi",null,"r")]),t("mo",{stretchy:"false"},")")])],-1))]),a[55]||(a[55]=s(" for all ")),t("mjx-container",U,[(l(),Q("svg",X,a[39]||(a[39]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45B",d:"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[40]||(a[40]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"n")])],-1))]),a[56]||(a[56]=s("."))]),a[477]||(a[477]=t("p",null,"IncompressibleNavierStokes provides a collection of explicit and implicit Runge-Kutta methods, in addition to Adams-Bashforth Crank-Nicolson and one-leg beta method time steppers.",-1)),a[478]||(a[478]=t("p",null,[s("The code is currently not adapted to time steppers from "),t("a",{href:"https://docs.sciml.ai/DiffEqDocs/stable/solvers/dae_solve/",target:"_blank",rel:"noreferrer"},"DifferentialEquations.jl"),s(", but they may be integrated in the future.")],-1)),t("details",W,[t("summary",null,[a[57]||(a[57]=t("a",{id:"IncompressibleNavierStokes.AbstractODEMethod",href:"#IncompressibleNavierStokes.AbstractODEMethod"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.AbstractODEMethod")],-1)),a[58]||(a[58]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[59]||(a[59]=e('julia abstract type AbstractODEMethod{T}
Abstract ODE method.
Fields
source
',4))]),t("details",q,[t("summary",null,[a[60]||(a[60]=t("a",{id:"IncompressibleNavierStokes.ode_method_cache",href:"#IncompressibleNavierStokes.ode_method_cache"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.ode_method_cache")],-1)),a[61]||(a[61]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[62]||(a[62]=e('julia ode_method_cache (method, setup, u, temp)
Get time stepper cache for the given ODE method.
source
',3))]),t("details",$,[t("summary",null,[a[63]||(a[63]=t("a",{id:"IncompressibleNavierStokes.runge_kutta_method",href:"#IncompressibleNavierStokes.runge_kutta_method"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.runge_kutta_method")],-1)),a[64]||(a[64]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[65]||(a[65]=e(`julia runge_kutta_method (
+ A,
+ b,
+ c,
+ r;
+ T,
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
Get Runge Kutta method. The function checks whether the method is explicit.
p_add_solve
: whether to add a pressure solve step to the method.
For implicit RK methods: newton_type
, maxiter
, abstol
, reltol
.
source
`,5))]),t("details",Y,[t("summary",null,[a[66]||(a[66]=t("a",{id:"IncompressibleNavierStokes.create_stepper",href:"#IncompressibleNavierStokes.create_stepper"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.create_stepper")],-1)),a[67]||(a[67]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[68]||(a[68]=e('julia create_stepper (method; setup, psolver, u, temp, t, n)
Create time stepper.
source
',3))]),t("details",_,[t("summary",null,[a[69]||(a[69]=t("a",{id:"IncompressibleNavierStokes.timestep",href:"#IncompressibleNavierStokes.timestep"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.timestep")],-1)),a[70]||(a[70]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[71]||(a[71]=e('julia timestep (method, stepper, Δt; θ = nothing )
Perform one time step.
Non-mutating/allocating/out-of-place version.
See also timestep!
.
source
',5))]),t("details",t1,[t("summary",null,[a[72]||(a[72]=t("a",{id:"IncompressibleNavierStokes.timestep!",href:"#IncompressibleNavierStokes.timestep!"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.timestep!")],-1)),a[73]||(a[73]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[74]||(a[74]=e('julia timestep! (method, stepper, Δt; θ = nothing , cache)
Perform one time step>
Mutating/non-allocating/in-place version.
See also timestep
.
source
',5))]),a[479]||(a[479]=t("h2",{id:"Adams-Bashforth-Crank-Nicolson-method",tabindex:"-1"},[s("Adams-Bashforth Crank-Nicolson method "),t("a",{class:"header-anchor",href:"#Adams-Bashforth-Crank-Nicolson-method","aria-label":'Permalink to "Adams-Bashforth Crank-Nicolson method {#Adams-Bashforth-Crank-Nicolson-method}"'},"")],-1)),t("details",a1,[t("summary",null,[a[75]||(a[75]=t("a",{id:"IncompressibleNavierStokes.AdamsBashforthCrankNicolsonMethod",href:"#IncompressibleNavierStokes.AdamsBashforthCrankNicolsonMethod"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.AdamsBashforthCrankNicolsonMethod")],-1)),a[76]||(a[76]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[151]||(a[151]=e('julia struct AdamsBashforthCrankNicolsonMethod{T, M} <: IncompressibleNavierStokes.AbstractODEMethod{T}
IMEX AB-CN: Adams-Bashforth for explicit convection (parameters α₁
and α₂
) and Crank-Nicolson for implicit diffusion (implicitness θ
). The method is second order for θ = 1/2
.
The LU decomposition of the LHS matrix is computed every time the time step changes.
Note that, in contrast to explicit methods, the pressure from previous time steps has an influence on the accuracy of the velocity.
',4)),t("p",null,[a[91]||(a[91]=s("We here require that the time step ")),t("mjx-container",s1,[(l(),Q("svg",e1,a[77]||(a[77]=[e(' ',1)]))),a[78]||(a[78]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[92]||(a[92]=s(" is constant. This methods uses Adams-Bashforth for the convective terms and Crank-Nicolson stepping for the diffusion and body force terms. Given the velocity field ")),t("mjx-container",Q1,[(l(),Q("svg",l1,a[79]||(a[79]=[e(' ',1)]))),a[80]||(a[80]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")")])],-1))]),a[93]||(a[93]=s(" at a time ")),t("mjx-container",T1,[(l(),Q("svg",i1,a[81]||(a[81]=[e(' ',1)]))),a[82]||(a[82]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mn",null,"0")])])],-1))]),a[94]||(a[94]=s(" and its previous value ")),t("mjx-container",n1,[(l(),Q("svg",o1,a[83]||(a[83]=[e(' ',1)]))),a[84]||(a[84]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t"),t("mo",{stretchy:"false"},")")])],-1))]),a[95]||(a[95]=s(" at the previous time ")),t("mjx-container",r1,[(l(),Q("svg",d1,a[85]||(a[85]=[e(' ',1)]))),a[86]||(a[86]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,"="),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[96]||(a[96]=s(", the predicted velocity field ")),t("mjx-container",m1,[(l(),Q("svg",p1,a[87]||(a[87]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D462",d:"M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[88]||(a[88]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u")])],-1))]),a[97]||(a[97]=s(" at the time ")),t("mjx-container",h1,[(l(),Q("svg",g1,a[89]||(a[89]=[e(' ',1)]))),a[90]||(a[90]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"t"),t("mo",null,"="),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[98]||(a[98]=s(" is defined by first computing a tentative velocity:"))]),t("mjx-container",k1,[(l(),Q("svg",c1,a[99]||(a[99]=[e(' ',1)]))),a[100]||(a[100]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mfrac",null,[t("mrow",null,[t("mi",null,"v"),t("mo",null,"−"),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")])]),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"α"),t("mn",null,"0")]),t("mi",null,"C"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,","),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("msub",null,[t("mi",null,"α"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mi",null,"C"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,","),t("msub",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"+"),t("mi",null,"θ"),t("mo",{stretchy:"false"},"("),t("mi",null,"D"),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"D")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"−"),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},"("),t("mi",null,"D"),t("mi",null,"v"),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"D")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"+"),t("mi",null,"θ"),t("mi",null,"f"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"−"),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mi",null,"f"),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("mi",null,"G"),t("msub",null,[t("mi",null,"p"),t("mn",null,"0")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,",")])])])])],-1))]),t("p",null,[a[111]||(a[111]=s("where ")),t("mjx-container",u1,[(l(),Q("svg",H1,a[101]||(a[101]=[e(' ',1)]))),a[102]||(a[102]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"θ"),t("mo",null,"∈"),t("mo",{stretchy:"false"},"["),t("mn",null,"0"),t("mo",null,","),t("mn",null,"1"),t("mo",{stretchy:"false"},"]")])],-1))]),a[112]||(a[112]=s(" is the Crank-Nicolson parameter (")),t("mjx-container",w1,[(l(),Q("svg",y1,a[103]||(a[103]=[e(' ',1)]))),a[104]||(a[104]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"θ"),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")])])],-1))]),a[113]||(a[113]=s(" for second order convergence), ")),t("mjx-container",b1,[(l(),Q("svg",x1,a[105]||(a[105]=[e(' ',1)]))),a[106]||(a[106]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"α"),t("mn",null,"0")]),t("mo",null,","),t("msub",null,[t("mi",null,"α"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},")"),t("mo",null,"="),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mfrac",null,[t("mn",null,"3"),t("mn",null,"2")]),t("mo",null,","),t("mo",null,"−"),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")]),t("mo",{"data-mjx-texclass":"CLOSE"},")")])])],-1))]),a[114]||(a[114]=s(" are the Adams-Bashforth coefficients, and ")),t("mjx-container",f1,[(l(),Q("svg",M1,a[107]||(a[107]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D463",d:"M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z",style:{"stroke-width":"3"}})])])],-1)]))),a[108]||(a[108]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"v")])],-1))]),a[115]||(a[115]=s(" is a tentative velocity yet to be made divergence free. We can group the terms containing ")),t("mjx-container",L1,[(l(),Q("svg",v1,a[109]||(a[109]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D463",d:"M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z",style:{"stroke-width":"3"}})])])],-1)]))),a[110]||(a[110]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"v")])],-1))]),a[116]||(a[116]=s(" on the left hand side, to obtain"))]),t("mjx-container",E1,[(l(),Q("svg",Z1,a[117]||(a[117]=[e(' ',1)]))),a[118]||(a[118]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])]),t("mi",null,"I"),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"−"),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mi",null,"D"),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("mi",null,"v")]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])]),t("mi",null,"I"),t("mo",null,"−"),t("mi",null,"θ"),t("mi",null,"D"),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")])])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"α"),t("mn",null,"0")]),t("mi",null,"C"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,","),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("msub",null,[t("mi",null,"α"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mi",null,"C"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,","),t("msub",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"+"),t("mi",null,"θ"),t("msub",null,[t("mi",null,"y"),t("mi",null,"D")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"−"),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("msub",null,[t("mi",null,"y"),t("mi",null,"D")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"+"),t("mi",null,"θ"),t("mi",null,"f"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"−"),t("mi",null,"θ"),t("mo",{stretchy:"false"},")"),t("mi",null,"f"),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("mi",null,"G"),t("msub",null,[t("mi",null,"p"),t("mn",null,"0")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,".")])])])])],-1))]),t("p",null,[a[125]||(a[125]=s("We can compute ")),t("mjx-container",j1,[(l(),Q("svg",D1,a[119]||(a[119]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D463",d:"M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z",style:{"stroke-width":"3"}})])])],-1)]))),a[120]||(a[120]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"v")])],-1))]),a[126]||(a[126]=s(" by inverting the positive definite matrix ")),t("mjx-container",S1,[(l(),Q("svg",V1,a[121]||(a[121]=[e(' ',1)]))),a[122]||(a[122]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])]),t("mi",null,"I"),t("mo",null,"−"),t("mi",null,"θ"),t("mi",null,"D"),t("mo",{"data-mjx-texclass":"CLOSE"},")")])])],-1))]),a[127]||(a[127]=s(" for the given right hand side using a suitable linear solver. Assuming ")),t("mjx-container",I1,[(l(),Q("svg",R1,a[123]||(a[123]=[e(' ',1)]))),a[124]||(a[124]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[128]||(a[128]=s(" is constant, we can precompute a Cholesky factorization of this matrix before starting time stepping."))]),t("p",null,[a[131]||(a[131]=s("We then compute the pressure difference ")),t("mjx-container",F1,[(l(),Q("svg",C1,a[129]||(a[129]=[e(' ',1)]))),a[130]||(a[130]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p")])],-1))]),a[132]||(a[132]=s(" by solving"))]),t("mjx-container",N1,[(l(),Q("svg",K1,a[133]||(a[133]=[e(' ',1)]))),a[134]||(a[134]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"L"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p"),t("mo",null,"="),t("mi",null,"W"),t("mfrac",null,[t("mrow",null,[t("mi",null,"M"),t("mi",null,"v"),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")")]),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])]),t("mo",null,"−"),t("mi",null,"W"),t("mi",null,"M"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,",")])],-1))]),t("p",null,[a[137]||(a[137]=s("after which a divergence free velocity ")),t("mjx-container",A1,[(l(),Q("svg",B1,a[135]||(a[135]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D462",d:"M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[136]||(a[136]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u")])],-1))]),a[138]||(a[138]=s(" can be enforced:"))]),t("mjx-container",O1,[(l(),Q("svg",P1,a[139]||(a[139]=[e(' ',1)]))),a[140]||(a[140]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"u"),t("mo",null,"="),t("mi",null,"v"),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t"),t("mo",{stretchy:"false"},"("),t("mi",null,"G"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p"),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,".")])],-1))]),t("p",null,[a[147]||(a[147]=s("A first order accurate prediction of the corresponding pressure is ")),t("mjx-container",G1,[(l(),Q("svg",z1,a[141]||(a[141]=[e(' ',1)]))),a[142]||(a[142]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"p"),t("mo",null,"="),t("msub",null,[t("mi",null,"p"),t("mn",null,"0")]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p")])],-1))]),a[148]||(a[148]=s(". However, since this pressure is reused in the next time step, we perform an additional pressure solve to avoid accumulating first order errors. The resulting pressure ")),t("mjx-container",J1,[(l(),Q("svg",U1,a[143]||(a[143]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45D",d:"M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z",style:{"stroke-width":"3"}})])])],-1)]))),a[144]||(a[144]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"p")])],-1))]),a[149]||(a[149]=s(" is then accurate to the same order as ")),t("mjx-container",X1,[(l(),Q("svg",W1,a[145]||(a[145]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D462",d:"M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[146]||(a[146]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u")])],-1))]),a[150]||(a[150]=s("."))]),a[152]||(a[152]=e('Fields
α₁
α₂
θ
p_add_solve
method_startup
source
',3))]),a[480]||(a[480]=t("h2",{id:"One-leg-beta-method",tabindex:"-1"},[s("One-leg beta method "),t("a",{class:"header-anchor",href:"#One-leg-beta-method","aria-label":'Permalink to "One-leg beta method {#One-leg-beta-method}"'},"")],-1)),t("details",q1,[t("summary",null,[a[153]||(a[153]=t("a",{id:"IncompressibleNavierStokes.OneLegMethod",href:"#IncompressibleNavierStokes.OneLegMethod"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.OneLegMethod")],-1)),a[154]||(a[154]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[202]||(a[202]=e('julia struct OneLegMethod{T, M} <: IncompressibleNavierStokes.AbstractODEMethod{T}
Explicit one-leg β-method following symmetry-preserving discretization of turbulent flow. See Verstappen and Veldman [14 ] [16 ] for details.
',2)),t("p",null,[a[175]||(a[175]=s("We here require that the time step ")),t("mjx-container",$1,[(l(),Q("svg",Y1,a[155]||(a[155]=[e(' ',1)]))),a[156]||(a[156]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[176]||(a[176]=s(" is constant. Given the velocity ")),t("mjx-container",_1,[(l(),Q("svg",t2,a[157]||(a[157]=[e(' ',1)]))),a[158]||(a[158]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mn",null,"0")])])],-1))]),a[177]||(a[177]=s(" and pressure ")),t("mjx-container",a2,[(l(),Q("svg",s2,a[159]||(a[159]=[e(' ',1)]))),a[160]||(a[160]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"p"),t("mn",null,"0")])])],-1))]),a[178]||(a[178]=s(" at the current time ")),t("mjx-container",e2,[(l(),Q("svg",Q2,a[161]||(a[161]=[e(' ',1)]))),a[162]||(a[162]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mn",null,"0")])])],-1))]),a[179]||(a[179]=s(" and their previous values ")),t("mjx-container",l2,[(l(),Q("svg",T2,a[163]||(a[163]=[e(' ',1)]))),a[164]||(a[164]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])])])],-1))]),a[180]||(a[180]=s(" and ")),t("mjx-container",i2,[(l(),Q("svg",n2,a[165]||(a[165]=[e(' ',1)]))),a[166]||(a[166]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"p"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])])])],-1))]),a[181]||(a[181]=s(" at the time ")),t("mjx-container",o2,[(l(),Q("svg",r2,a[167]||(a[167]=[e(' ',1)]))),a[168]||(a[168]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,"="),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[182]||(a[182]=s(', we start by computing the "offstep" values ')),t("mjx-container",d2,[(l(),Q("svg",m2,a[169]||(a[169]=[e(' ',1)]))),a[170]||(a[170]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"v"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"+"),t("mi",null,"β"),t("mo",{stretchy:"false"},")"),t("msub",null,[t("mi",null,"v"),t("mn",null,"0")]),t("mo",null,"−"),t("mi",null,"β"),t("msub",null,[t("mi",null,"v"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])])])],-1))]),a[183]||(a[183]=s(" and ")),t("mjx-container",p2,[(l(),Q("svg",h2,a[171]||(a[171]=[e(' ',1)]))),a[172]||(a[172]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"Q"),t("mo",null,"="),t("mo",{stretchy:"false"},"("),t("mn",null,"1"),t("mo",null,"+"),t("mi",null,"β"),t("mo",{stretchy:"false"},")"),t("msub",null,[t("mi",null,"p"),t("mn",null,"0")]),t("mo",null,"−"),t("mi",null,"β"),t("msub",null,[t("mi",null,"p"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])])])],-1))]),a[184]||(a[184]=s(" for some ")),t("mjx-container",g2,[(l(),Q("svg",k2,a[173]||(a[173]=[e(' ',1)]))),a[174]||(a[174]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"β"),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")])])],-1))]),a[185]||(a[185]=s("."))]),t("p",null,[a[188]||(a[188]=s("A tentative velocity field ")),t("mjx-container",c2,[(l(),Q("svg",u2,a[186]||(a[186]=[e(' ',1)]))),a[187]||(a[187]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"~")])])])],-1))]),a[189]||(a[189]=s(" is then computed as follows:"))]),t("mjx-container",H2,[(l(),Q("svg",w2,a[190]||(a[190]=[e(' ',1)]))),a[191]||(a[191]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"~")])]),t("mo",null,"="),t("mfrac",null,[t("mn",null,"1"),t("mrow",null,[t("mi",null,"β"),t("mo",null,"+"),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")])])]),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mn",null,"2"),t("mi",null,"β"),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"−"),t("mrow",{"data-mjx-texclass":"INNER"},[t("mo",{"data-mjx-texclass":"OPEN"},"("),t("mi",null,"β"),t("mo",null,"−"),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")]),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("msub",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t"),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("mi",null,"v"),t("mo",null,","),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t"),t("mo",{stretchy:"false"},"("),t("mi",null,"G"),t("mi",null,"Q"),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",{"data-mjx-texclass":"CLOSE"},")")]),t("mo",null,".")])],-1))]),t("p",null,[a[194]||(a[194]=s("A pressure correction ")),t("mjx-container",y2,[(l(),Q("svg",b2,a[192]||(a[192]=[e(' ',1)]))),a[193]||(a[193]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p")])],-1))]),a[195]||(a[195]=s(" is obtained by solving the Poisson equation"))]),t("mjx-container",x2,[(l(),Q("svg",f2,a[196]||(a[196]=[e(' ',1)]))),a[197]||(a[197]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"L"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p"),t("mo",null,"="),t("mfrac",null,[t("mrow",null,[t("mi",null,"β"),t("mo",null,"+"),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")])]),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])]),t("mi",null,"W"),t("mo",{stretchy:"false"},"("),t("mi",null,"M"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"~")])]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,".")])],-1))]),a[203]||(a[203]=t("p",null,"Finally, the divergence free velocity field is given by",-1)),t("mjx-container",M2,[(l(),Q("svg",L2,a[198]||(a[198]=[e(' ',1)]))),a[199]||(a[199]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"u"),t("mo",null,"="),t("mrow",{"data-mjx-texclass":"ORD"},[t("mover",null,[t("mi",null,"v"),t("mo",{stretchy:"false"},"~")])]),t("mo",null,"−"),t("mfrac",null,[t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")]),t("mrow",null,[t("mi",null,"β"),t("mo",null,"+"),t("mfrac",null,[t("mn",null,"1"),t("mn",null,"2")])])]),t("mi",null,"G"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p"),t("mo",null,",")])],-1))]),a[204]||(a[204]=t("p",null,"while the second order accurate pressure is given by",-1)),t("mjx-container",v2,[(l(),Q("svg",E2,a[200]||(a[200]=[e(' ',1)]))),a[201]||(a[201]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mi",null,"p"),t("mo",null,"="),t("mn",null,"2"),t("msub",null,[t("mi",null,"p"),t("mn",null,"0")]),t("mo",null,"−"),t("msub",null,[t("mi",null,"p"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,"+"),t("mfrac",null,[t("mn",null,"4"),t("mn",null,"3")]),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"p"),t("mo",null,".")])],-1))]),a[205]||(a[205]=t("p",null,[t("strong",null,"Fields")],-1)),a[206]||(a[206]=t("ul",null,[t("li",null,[t("p",null,[t("code",null,"β")])]),t("li",null,[t("p",null,[t("code",null,"p_add_solve")])]),t("li",null,[t("p",null,[t("code",null,"method_startup")])])],-1)),a[207]||(a[207]=t("p",null,[t("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/time_steppers/methods.jl#L90",target:"_blank",rel:"noreferrer"},"source")],-1))]),a[481]||(a[481]=t("h2",{id:"Runge-Kutta-methods",tabindex:"-1"},[s("Runge-Kutta methods "),t("a",{class:"header-anchor",href:"#Runge-Kutta-methods","aria-label":'Permalink to "Runge-Kutta methods {#Runge-Kutta-methods}"'},"")],-1)),t("details",Z2,[t("summary",null,[a[208]||(a[208]=t("a",{id:"IncompressibleNavierStokes.AbstractRungeKuttaMethod",href:"#IncompressibleNavierStokes.AbstractRungeKuttaMethod"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.AbstractRungeKuttaMethod")],-1)),a[209]||(a[209]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[210]||(a[210]=e('julia abstract type AbstractRungeKuttaMethod{T} <: IncompressibleNavierStokes.AbstractODEMethod{T}
Abstract Runge Kutta method.
Fields
source
',4))]),t("details",j2,[t("summary",null,[a[211]||(a[211]=t("a",{id:"IncompressibleNavierStokes.ExplicitRungeKuttaMethod",href:"#IncompressibleNavierStokes.ExplicitRungeKuttaMethod"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.ExplicitRungeKuttaMethod")],-1)),a[212]||(a[212]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[313]||(a[313]=e('julia struct ExplicitRungeKuttaMethod{T} <: IncompressibleNavierStokes.AbstractRungeKuttaMethod{T}
Explicit Runge Kutta method. See Sanderse [17 ].
',2)),t("p",null,[a[229]||(a[229]=s("Consider the velocity field ")),t("mjx-container",D2,[(l(),Q("svg",S2,a[213]||(a[213]=[e(' ',1)]))),a[214]||(a[214]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mn",null,"0")])])],-1))]),a[230]||(a[230]=s(" at a certain time ")),t("mjx-container",V2,[(l(),Q("svg",I2,a[215]||(a[215]=[e(' ',1)]))),a[216]||(a[216]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mn",null,"0")])])],-1))]),a[231]||(a[231]=s(". We will now perform one time step to ")),t("mjx-container",R2,[(l(),Q("svg",F2,a[217]||(a[217]=[e(' ',1)]))),a[218]||(a[218]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"t"),t("mo",null,"="),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[232]||(a[232]=s(". For explicit Runge-Kutta methods, this time step is divided into ")),t("mjx-container",C2,[(l(),Q("svg",N2,a[219]||(a[219]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D460",d:"M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z",style:{"stroke-width":"3"}})])])],-1)]))),a[220]||(a[220]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"s")])],-1))]),a[233]||(a[233]=s(" sub-steps ")),t("mjx-container",K2,[(l(),Q("svg",A2,a[221]||(a[221]=[e(' ',1)]))),a[222]||(a[222]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",null,"="),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"Δ"),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")])])],-1))]),a[234]||(a[234]=s(" with increment ")),t("mjx-container",B2,[(l(),Q("svg",O2,a[223]||(a[223]=[e(' ',1)]))),a[224]||(a[224]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",null,"="),t("msub",null,[t("mi",null,"c"),t("mi",null,"i")]),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[235]||(a[235]=s(". The final substep performs the full time step ")),t("mjx-container",P2,[(l(),Q("svg",G2,a[225]||(a[225]=[e(' ',1)]))),a[226]||(a[226]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("msub",null,[t("mi",null,"t"),t("mi",null,"s")]),t("mo",null,"="),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[236]||(a[236]=s(" such that ")),t("mjx-container",z2,[(l(),Q("svg",J2,a[227]||(a[227]=[e(' ',1)]))),a[228]||(a[228]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"t"),t("mi",null,"s")]),t("mo",null,"="),t("mi",null,"t")])],-1))]),a[237]||(a[237]=s("."))]),t("p",null,[a[244]||(a[244]=s("For ")),t("mjx-container",U2,[(l(),Q("svg",X2,a[238]||(a[238]=[e(' ',1)]))),a[239]||(a[239]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"i"),t("mo",null,"="),t("mn",null,"1"),t("mo",null,","),t("mo",null,"…"),t("mo",null,","),t("mi",null,"s")])],-1))]),a[245]||(a[245]=s(", the intermediate velocity ")),t("mjx-container",W2,[(l(),Q("svg",q2,a[240]||(a[240]=[e(' ',1)]))),a[241]||(a[241]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mi",null,"i")])])],-1))]),a[246]||(a[246]=s(" and pressure ")),t("mjx-container",$2,[(l(),Q("svg",Y2,a[242]||(a[242]=[e(' ',1)]))),a[243]||(a[243]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"p"),t("mi",null,"i")])])],-1))]),a[247]||(a[247]=s(" are computed as follows:"))]),t("mjx-container",_2,[(l(),Q("svg",t3,a[248]||(a[248]=[e(' ',1)]))),a[249]||(a[249]=t("mjx-assistive-mml",{unselectable:"on",display:"block",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",overflow:"hidden",width:"100%"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML",display:"block"},[t("mtable",{displaystyle:"true",columnalign:"right left",columnspacing:"0em",rowspacing:"3pt"},[t("mtr",null,[t("mtd",null,[t("msub",null,[t("mi",null,"k"),t("mi",null,"i")])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"F"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"u"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mo",null,"−"),t("mn",null,"1")])]),t("mo",null,","),t("msub",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mo",null,"−"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("msub",null,[t("mi",null,"y"),t("mi",null,"G")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mo",null,"−"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},")")])]),t("mtr",null,[t("mtd",null,[t("msub",null,[t("mi",null,"v"),t("mi",null,"i")])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"+"),t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t"),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"j"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"i")]),t("msub",null,[t("mi",null,"a"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("msub",null,[t("mi",null,"k"),t("mi",null,"j")])])]),t("mtr",null,[t("mtd",null,[t("mi",null,"L"),t("msub",null,[t("mi",null,"p"),t("mi",null,"i")])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"W"),t("mi",null,"M"),t("mfrac",null,[t("mn",null,"1"),t("msub",null,[t("mi",null,"c"),t("mi",null,"i")])]),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"j"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"i")]),t("msub",null,[t("mi",null,"a"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("msub",null,[t("mi",null,"k"),t("mi",null,"j")]),t("mo",null,"+"),t("mi",null,"W"),t("mfrac",null,[t("mrow",null,[t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")")]),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")])])])])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"W"),t("mfrac",null,[t("mrow",null,[t("mo",{stretchy:"false"},"("),t("mi",null,"M"),t("msub",null,[t("mi",null,"v"),t("mi",null,"i")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("mo",{stretchy:"false"},"("),t("mi",null,"M"),t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")")]),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("msubsup",null,[t("mi",null,"t"),t("mi",null,"i"),t("mi",null,"n")])])])])]),t("mtr",null,[t("mtd"),t("mtd",null,[t("mi"),t("mo",null,"="),t("mi",null,"W"),t("mfrac",null,[t("mrow",null,[t("mi",null,"M"),t("msub",null,[t("mi",null,"v"),t("mi",null,"i")]),t("mo",null,"+"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",{stretchy:"false"},")")]),t("mrow",null,[t("mi",{mathvariant:"normal"},"Δ"),t("msubsup",null,[t("mi",null,"t"),t("mi",null,"i"),t("mi",null,"n")])])])])]),t("mtr",null,[t("mtd",null,[t("msub",null,[t("mi",null,"u"),t("mi",null,"i")])]),t("mtd",null,[t("mi"),t("mo",null,"="),t("msub",null,[t("mi",null,"v"),t("mi",null,"i")]),t("mo",null,"−"),t("mi",{mathvariant:"normal"},"Δ"),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mi",null,"G"),t("msub",null,[t("mi",null,"p"),t("mi",null,"i")]),t("mo",null,",")])])])])],-1))]),t("p",null,[a[254]||(a[254]=s("where ")),t("mjx-container",a3,[(l(),Q("svg",s3,a[250]||(a[250]=[e(' ',1)]))),a[251]||(a[251]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"a"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])]),t("msub",null,[t("mo",{stretchy:"false"},")"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])])])],-1))]),a[255]||(a[255]=s(" are the Butcher tableau coefficients of the RK-method, with the convention ")),t("mjx-container",e3,[(l(),Q("svg",Q3,a[252]||(a[252]=[e(' ',1)]))),a[253]||(a[253]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"c"),t("mi",null,"i")]),t("mo",null,"="),t("munderover",null,[t("mo",{"data-mjx-texclass":"OP"},"∑"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"j"),t("mo",null,"="),t("mn",null,"1")]),t("mi",null,"i")]),t("msub",null,[t("mi",null,"a"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"i"),t("mi",null,"j")])])])],-1))]),a[256]||(a[256]=s("."))]),t("p",null,[a[285]||(a[285]=s("Finally, we return ")),t("mjx-container",l3,[(l(),Q("svg",T3,a[257]||(a[257]=[e(' ',1)]))),a[258]||(a[258]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mi",null,"s")])])],-1))]),a[286]||(a[286]=s(". If ")),t("mjx-container",i3,[(l(),Q("svg",n3,a[259]||(a[259]=[e(' ',1)]))),a[260]||(a[260]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")")])],-1))]),a[287]||(a[287]=s(", we get the accuracy ")),t("mjx-container",o3,[(l(),Q("svg",r3,a[261]||(a[261]=[e(' ',1)]))),a[262]||(a[262]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mi",null,"s")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{stretchy:"false"},"("),t("mi",{mathvariant:"normal"},"Δ"),t("msup",null,[t("mi",null,"t"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",null,"r"),t("mo",null,"+"),t("mn",null,"1")])]),t("mo",{stretchy:"false"},")")])],-1))]),a[288]||(a[288]=s(", where ")),t("mjx-container",d3,[(l(),Q("svg",m3,a[263]||(a[263]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45F",d:"M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[264]||(a[264]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"r")])],-1))]),a[289]||(a[289]=s(" is the order of the RK-method. If we perform ")),t("mjx-container",p3,[(l(),Q("svg",h3,a[265]||(a[265]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45B",d:"M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[266]||(a[266]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"n")])],-1))]),a[290]||(a[290]=s(" RK time steps instead of one, starting at exact initial conditions ")),t("mjx-container",g3,[(l(),Q("svg",k3,a[267]||(a[267]=[e(' ',1)]))),a[268]||(a[268]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"u"),t("mn",null,"0")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("mn",null,"0"),t("mo",{stretchy:"false"},")")])],-1))]),a[291]||(a[291]=s(", then ")),t("mjx-container",c3,[(l(),Q("svg",u3,a[269]||(a[269]=[e(' ',1)]))),a[270]||(a[270]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msup",null,[t("mi",null,"u"),t("mi",null,"n")]),t("mo",null,"="),t("mi",null,"u"),t("mo",{stretchy:"false"},"("),t("msup",null,[t("mi",null,"t"),t("mi",null,"n")]),t("mo",{stretchy:"false"},")"),t("mo",null,"+"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{"data-mjx-variant":"-tex-calligraphic",mathvariant:"script"},"O")]),t("mo",{stretchy:"false"},"("),t("mi",{mathvariant:"normal"},"Δ"),t("msup",null,[t("mi",null,"t"),t("mi",null,"r")]),t("mo",{stretchy:"false"},")")])],-1))]),a[292]||(a[292]=s(" for all ")),t("mjx-container",H3,[(l(),Q("svg",w3,a[271]||(a[271]=[e(' ',1)]))),a[272]||(a[272]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"n"),t("mo",null,"∈"),t("mo",{fence:"false",stretchy:"false"},"{"),t("mn",null,"1"),t("mo",null,","),t("mo",null,"…"),t("mo",null,","),t("mi",null,"N"),t("mo",{fence:"false",stretchy:"false"},"}")])],-1))]),a[293]||(a[293]=s(". Note that for a given ")),t("mjx-container",y3,[(l(),Q("svg",b3,a[273]||(a[273]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D462",d:"M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[274]||(a[274]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u")])],-1))]),a[294]||(a[294]=s(", the corresponding pressure ")),t("mjx-container",x3,[(l(),Q("svg",f3,a[275]||(a[275]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D45D",d:"M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z",style:{"stroke-width":"3"}})])])],-1)]))),a[276]||(a[276]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"p")])],-1))]),a[295]||(a[295]=s(" can be calculated to the same accuracy as ")),t("mjx-container",M3,[(l(),Q("svg",L3,a[277]||(a[277]=[t("g",{stroke:"currentColor",fill:"currentColor","stroke-width":"0",transform:"scale(1,-1)"},[t("g",{"data-mml-node":"math"},[t("g",{"data-mml-node":"mi"},[t("path",{"data-c":"1D462",d:"M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z",style:{"stroke-width":"3"}})])])],-1)]))),a[278]||(a[278]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",null,"u")])],-1))]),a[296]||(a[296]=s(" by doing an additional pressure projection after each outer time step ")),t("mjx-container",v3,[(l(),Q("svg",E3,a[279]||(a[279]=[e(' ',1)]))),a[280]||(a[280]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mi",{mathvariant:"normal"},"Δ"),t("mi",null,"t")])],-1))]),a[297]||(a[297]=s(" (if we know ")),t("mjx-container",Z3,[(l(),Q("svg",j3,a[281]||(a[281]=[e(' ',1)]))),a[282]||(a[282]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")])]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])]),t("mo",{stretchy:"false"},"("),t("mi",null,"t"),t("mo",{stretchy:"false"},")")])],-1))]),a[298]||(a[298]=s("), or to first order accuracy by simply returning ")),t("mjx-container",D3,[(l(),Q("svg",S3,a[283]||(a[283]=[e(' ',1)]))),a[284]||(a[284]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"p"),t("mi",null,"s")])])],-1))]),a[299]||(a[299]=s("."))]),t("p",null,[a[308]||(a[308]=s("Note that each of the sub-step velocities ")),t("mjx-container",V3,[(l(),Q("svg",I3,a[300]||(a[300]=[e(' ',1)]))),a[301]||(a[301]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"u"),t("mi",null,"i")])])],-1))]),a[309]||(a[309]=s(" is divergence free, after projecting the tentative velocities ")),t("mjx-container",R3,[(l(),Q("svg",F3,a[302]||(a[302]=[e(' ',1)]))),a[303]||(a[303]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("msub",null,[t("mi",null,"v"),t("mi",null,"i")])])],-1))]),a[310]||(a[310]=s(". This is ensured due to the judiciously chosen replacement of ")),t("mjx-container",C3,[(l(),Q("svg",N3,a[304]||(a[304]=[e(' ',1)]))),a[305]||(a[305]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mfrac",null,[t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")])]),t("mrow",null,[t("mrow",{"data-mjx-texclass":"ORD"},[t("mi",{mathvariant:"normal"},"d")]),t("mi",null,"t")])]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",{stretchy:"false"},")")])],-1))]),a[311]||(a[311]=s(" with ")),t("mjx-container",K3,[(l(),Q("svg",A3,a[306]||(a[306]=[e(' ',1)]))),a[307]||(a[307]=t("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[t("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")]),t("mo",{stretchy:"false"},")"),t("mo",null,"−"),t("msub",null,[t("mi",null,"y"),t("mi",null,"M")]),t("mo",{stretchy:"false"},"("),t("msub",null,[t("mi",null,"t"),t("mn",null,"0")]),t("mo",{stretchy:"false"},")"),t("mo",{stretchy:"false"},")"),t("mrow",{"data-mjx-texclass":"ORD"},[t("mo",null,"/")]),t("mi",{mathvariant:"normal"},"Δ"),t("msub",null,[t("mi",null,"t"),t("mi",null,"i")])])],-1))]),a[312]||(a[312]=s(". The space-discrete divergence-freeness is thus perfectly preserved, even though the time discretization introduces other errors."))]),a[314]||(a[314]=e('Fields
source
',3))]),t("details",B3,[t("summary",null,[a[315]||(a[315]=t("a",{id:"IncompressibleNavierStokes.ImplicitRungeKuttaMethod",href:"#IncompressibleNavierStokes.ImplicitRungeKuttaMethod"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.ImplicitRungeKuttaMethod")],-1)),a[316]||(a[316]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[317]||(a[317]=e('julia struct ImplicitRungeKuttaMethod{T} <: IncompressibleNavierStokes.AbstractRungeKuttaMethod{T}
Implicit Runge Kutta method. See Sanderse [18 ].
The implicit linear system is solved at each time step using Newton's method. The newton_type
may be one of the following:
:no
: Replace iteration matrix with I/Δt (no Jacobian)
:approximate
: Build Jacobian once before iterations only
:full
: Build Jacobian at each iteration
Fields
A
b
c
r
newton_type
maxiter
abstol
reltol
p_add_solve
source
',7))]),t("details",O3,[t("summary",null,[a[318]||(a[318]=t("a",{id:"IncompressibleNavierStokes.RKMethods",href:"#IncompressibleNavierStokes.RKMethods"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods")],-1)),a[319]||(a[319]=s()),i(T,{type:"info",class:"jlObjectType jlModule",text:"Module"})]),a[320]||(a[320]=e('Set up Butcher arrays A
, b
, and c
, as well as and SSP coefficient r
. For families of methods, optional input s
is the number of stages.
Original (MATLAB) by David Ketcheson, extended by Benjamin Sanderse.
Exports
source
',5))]),t("details",P3,[t("summary",null,[a[321]||(a[321]=t("a",{id:"IncompressibleNavierStokes.LMWray3",href:"#IncompressibleNavierStokes.LMWray3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.LMWray3")],-1)),a[322]||(a[322]=s()),i(T,{type:"info",class:"jlObjectType jlType",text:"Type"})]),a[323]||(a[323]=e('julia struct LMWray3{T} <: IncompressibleNavierStokes.AbstractRungeKuttaMethod{T}
Low memory Wray 3rd order scheme. Uses 3 vector fields and one scalar field.
Fields
source
',4))]),a[482]||(a[482]=t("h3",{id:"Explicit-Methods",tabindex:"-1"},[s("Explicit Methods "),t("a",{class:"header-anchor",href:"#Explicit-Methods","aria-label":'Permalink to "Explicit Methods {#Explicit-Methods}"'},"")],-1)),t("details",G3,[t("summary",null,[a[324]||(a[324]=t("a",{id:"IncompressibleNavierStokes.RKMethods.FE11",href:"#IncompressibleNavierStokes.RKMethods.FE11"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.FE11")],-1)),a[325]||(a[325]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[326]||(a[326]=e(`julia FE11 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
FE11 (Forward Euler).
source
`,3))]),t("details",z3,[t("summary",null,[a[327]||(a[327]=t("a",{id:"IncompressibleNavierStokes.RKMethods.SSP22",href:"#IncompressibleNavierStokes.RKMethods.SSP22"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.SSP22")],-1)),a[328]||(a[328]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[329]||(a[329]=e(`julia SSP22 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
SSP22.
source
`,3))]),t("details",J3,[t("summary",null,[a[330]||(a[330]=t("a",{id:"IncompressibleNavierStokes.RKMethods.SSP42",href:"#IncompressibleNavierStokes.RKMethods.SSP42"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.SSP42")],-1)),a[331]||(a[331]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[332]||(a[332]=e(`julia SSP42 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
SSP42.
source
`,3))]),t("details",U3,[t("summary",null,[a[333]||(a[333]=t("a",{id:"IncompressibleNavierStokes.RKMethods.SSP33",href:"#IncompressibleNavierStokes.RKMethods.SSP33"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.SSP33")],-1)),a[334]||(a[334]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[335]||(a[335]=e(`julia SSP33 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
SSP33.
source
`,3))]),t("details",X3,[t("summary",null,[a[336]||(a[336]=t("a",{id:"IncompressibleNavierStokes.RKMethods.SSP43",href:"#IncompressibleNavierStokes.RKMethods.SSP43"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.SSP43")],-1)),a[337]||(a[337]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[338]||(a[338]=e(`julia SSP43 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
SSP43.
source
`,3))]),t("details",W3,[t("summary",null,[a[339]||(a[339]=t("a",{id:"IncompressibleNavierStokes.RKMethods.SSP104",href:"#IncompressibleNavierStokes.RKMethods.SSP104"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.SSP104")],-1)),a[340]||(a[340]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[341]||(a[341]=e(`julia SSP104 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
SSP104.
source
`,3))]),t("details",q3,[t("summary",null,[a[342]||(a[342]=t("a",{id:"IncompressibleNavierStokes.RKMethods.rSSPs2",href:"#IncompressibleNavierStokes.RKMethods.rSSPs2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.rSSPs2")],-1)),a[343]||(a[343]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[344]||(a[344]=e(`julia rSSPs2 (
+;
+ ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
+rSSPs2 (
+ s;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
Rational (optimal, low-storage) s
-stage 2nd order SSP.
source
`,3))]),t("details",$3,[t("summary",null,[a[345]||(a[345]=t("a",{id:"IncompressibleNavierStokes.RKMethods.rSSPs3",href:"#IncompressibleNavierStokes.RKMethods.rSSPs3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.rSSPs3")],-1)),a[346]||(a[346]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[347]||(a[347]=e(`julia rSSPs3 (
+;
+ ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
+rSSPs3 (
+ s;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
Rational (optimal, low-storage) s^2
-stage 3rd order SSP.
source
`,3))]),t("details",Y3,[t("summary",null,[a[348]||(a[348]=t("a",{id:"IncompressibleNavierStokes.RKMethods.Wray3",href:"#IncompressibleNavierStokes.RKMethods.Wray3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.Wray3")],-1)),a[349]||(a[349]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[350]||(a[350]=e(`julia Wray3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Wray's RK3.
source
`,3))]),t("details",_3,[t("summary",null,[a[351]||(a[351]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK56",href:"#IncompressibleNavierStokes.RKMethods.RK56"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK56")],-1)),a[352]||(a[352]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[353]||(a[353]=e(`julia RK56 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RK56.
source
`,3))]),t("details",t4,[t("summary",null,[a[354]||(a[354]=t("a",{id:"IncompressibleNavierStokes.RKMethods.DOPRI6",href:"#IncompressibleNavierStokes.RKMethods.DOPRI6"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.DOPRI6")],-1)),a[355]||(a[355]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[356]||(a[356]=e(`julia DOPRI6 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Dormand-Price pair.
source
`,3))]),a[483]||(a[483]=t("h3",{id:"Implicit-Methods",tabindex:"-1"},[s("Implicit Methods "),t("a",{class:"header-anchor",href:"#Implicit-Methods","aria-label":'Permalink to "Implicit Methods {#Implicit-Methods}"'},"")],-1)),t("details",a4,[t("summary",null,[a[357]||(a[357]=t("a",{id:"IncompressibleNavierStokes.RKMethods.BE11",href:"#IncompressibleNavierStokes.RKMethods.BE11"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.BE11")],-1)),a[358]||(a[358]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[359]||(a[359]=e(`julia BE11 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Backward Euler.
source
`,3))]),t("details",s4,[t("summary",null,[a[360]||(a[360]=t("a",{id:"IncompressibleNavierStokes.RKMethods.SDIRK34",href:"#IncompressibleNavierStokes.RKMethods.SDIRK34"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.SDIRK34")],-1)),a[361]||(a[361]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[362]||(a[362]=e(`julia SDIRK34 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
3-stage, 4th order singly diagonally implicit (SSP).
source
`,3))]),t("details",e4,[t("summary",null,[a[363]||(a[363]=t("a",{id:"IncompressibleNavierStokes.RKMethods.ISSPm2",href:"#IncompressibleNavierStokes.RKMethods.ISSPm2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.ISSPm2")],-1)),a[364]||(a[364]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[365]||(a[365]=e(`julia ISSPm2 (
+;
+ ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
+ISSPm2 (
+ s;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
Optimal DIRK SSP schemes of order 2.
source
`,3))]),t("details",Q4,[t("summary",null,[a[366]||(a[366]=t("a",{id:"IncompressibleNavierStokes.RKMethods.ISSPs3",href:"#IncompressibleNavierStokes.RKMethods.ISSPs3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.ISSPs3")],-1)),a[367]||(a[367]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[368]||(a[368]=e(`julia ISSPs3 (
+;
+ ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
+ISSPs3 (
+ s;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod, IncompressibleNavierStokes . ImplicitRungeKuttaMethod}
Optimal DIRK SSP schemes of order 3.
source
`,3))]),a[484]||(a[484]=t("h3",{id:"Half-explicit-methods",tabindex:"-1"},[s("Half explicit methods "),t("a",{class:"header-anchor",href:"#Half-explicit-methods","aria-label":'Permalink to "Half explicit methods {#Half-explicit-methods}"'},"")],-1)),t("details",l4,[t("summary",null,[a[369]||(a[369]=t("a",{id:"IncompressibleNavierStokes.RKMethods.HEM3",href:"#IncompressibleNavierStokes.RKMethods.HEM3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.HEM3")],-1)),a[370]||(a[370]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[371]||(a[371]=e(`julia HEM3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Brasey and Hairer.
source
`,3))]),t("details",T4,[t("summary",null,[a[372]||(a[372]=t("a",{id:"IncompressibleNavierStokes.RKMethods.HEM3BS",href:"#IncompressibleNavierStokes.RKMethods.HEM3BS"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.HEM3BS")],-1)),a[373]||(a[373]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[374]||(a[374]=e(`julia HEM3BS (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
HEM3BS.
source
`,3))]),t("details",i4,[t("summary",null,[a[375]||(a[375]=t("a",{id:"IncompressibleNavierStokes.RKMethods.HEM5",href:"#IncompressibleNavierStokes.RKMethods.HEM5"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.HEM5")],-1)),a[376]||(a[376]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[377]||(a[377]=e(`julia HEM5 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Brasey and Hairer, 5 stage, 4th order.
source
`,3))]),a[485]||(a[485]=t("h3",{id:"Classical-Methods",tabindex:"-1"},[s("Classical Methods "),t("a",{class:"header-anchor",href:"#Classical-Methods","aria-label":'Permalink to "Classical Methods {#Classical-Methods}"'},"")],-1)),t("details",n4,[t("summary",null,[a[378]||(a[378]=t("a",{id:"IncompressibleNavierStokes.RKMethods.GL1",href:"#IncompressibleNavierStokes.RKMethods.GL1"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.GL1")],-1)),a[379]||(a[379]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[380]||(a[380]=e(`julia GL1 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
GL1.
source
`,3))]),t("details",o4,[t("summary",null,[a[381]||(a[381]=t("a",{id:"IncompressibleNavierStokes.RKMethods.GL2",href:"#IncompressibleNavierStokes.RKMethods.GL2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.GL2")],-1)),a[382]||(a[382]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[383]||(a[383]=e(`julia GL2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
GL2.
source
`,3))]),t("details",r4,[t("summary",null,[a[384]||(a[384]=t("a",{id:"IncompressibleNavierStokes.RKMethods.GL3",href:"#IncompressibleNavierStokes.RKMethods.GL3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.GL3")],-1)),a[385]||(a[385]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[386]||(a[386]=e(`julia GL3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
GL3.
source
`,3))]),t("details",d4,[t("summary",null,[a[387]||(a[387]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RIA1",href:"#IncompressibleNavierStokes.RKMethods.RIA1"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RIA1")],-1)),a[388]||(a[388]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[389]||(a[389]=e(`julia RIA1 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
This is implicit Euler.
source
`,3))]),t("details",m4,[t("summary",null,[a[390]||(a[390]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RIA2",href:"#IncompressibleNavierStokes.RKMethods.RIA2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RIA2")],-1)),a[391]||(a[391]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[392]||(a[392]=e(`julia RIA2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RIA2.
source
`,3))]),t("details",p4,[t("summary",null,[a[393]||(a[393]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RIA3",href:"#IncompressibleNavierStokes.RKMethods.RIA3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RIA3")],-1)),a[394]||(a[394]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[395]||(a[395]=e(`julia RIA3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RIA3.
source
`,3))]),t("details",h4,[t("summary",null,[a[396]||(a[396]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RIIA1",href:"#IncompressibleNavierStokes.RKMethods.RIIA1"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RIIA1")],-1)),a[397]||(a[397]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[398]||(a[398]=e(`julia RIIA1 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RIIA1.
source
`,3))]),t("details",g4,[t("summary",null,[a[399]||(a[399]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RIIA2",href:"#IncompressibleNavierStokes.RKMethods.RIIA2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RIIA2")],-1)),a[400]||(a[400]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[401]||(a[401]=e(`julia RIIA2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RIIA2.
source
`,3))]),t("details",k4,[t("summary",null,[a[402]||(a[402]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RIIA3",href:"#IncompressibleNavierStokes.RKMethods.RIIA3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RIIA3")],-1)),a[403]||(a[403]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[404]||(a[404]=e(`julia RIIA3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RIIA3.
source
`,3))]),t("details",c4,[t("summary",null,[a[405]||(a[405]=t("a",{id:"IncompressibleNavierStokes.RKMethods.LIIIA2",href:"#IncompressibleNavierStokes.RKMethods.LIIIA2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.LIIIA2")],-1)),a[406]||(a[406]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[407]||(a[407]=e(`julia LIIIA2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
LIIIA2.
source
`,3))]),t("details",u4,[t("summary",null,[a[408]||(a[408]=t("a",{id:"IncompressibleNavierStokes.RKMethods.LIIIA3",href:"#IncompressibleNavierStokes.RKMethods.LIIIA3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.LIIIA3")],-1)),a[409]||(a[409]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[410]||(a[410]=e(`julia LIIIA3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
LIIIA3.
source
`,3))]),a[486]||(a[486]=t("h3",{id:"Chebyshev-methods",tabindex:"-1"},[s("Chebyshev methods "),t("a",{class:"header-anchor",href:"#Chebyshev-methods","aria-label":'Permalink to "Chebyshev methods {#Chebyshev-methods}"'},"")],-1)),t("details",H4,[t("summary",null,[a[411]||(a[411]=t("a",{id:"IncompressibleNavierStokes.RKMethods.CHDIRK3",href:"#IncompressibleNavierStokes.RKMethods.CHDIRK3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.CHDIRK3")],-1)),a[412]||(a[412]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[413]||(a[413]=e(`julia CHDIRK3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Chebyshev based DIRK (not algebraically stable).
source
`,3))]),t("details",w4,[t("summary",null,[a[414]||(a[414]=t("a",{id:"IncompressibleNavierStokes.RKMethods.CHCONS3",href:"#IncompressibleNavierStokes.RKMethods.CHCONS3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.CHCONS3")],-1)),a[415]||(a[415]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[416]||(a[416]=e(`julia CHCONS3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
CHCONS3.
source
`,3))]),t("details",y4,[t("summary",null,[a[417]||(a[417]=t("a",{id:"IncompressibleNavierStokes.RKMethods.CHC3",href:"#IncompressibleNavierStokes.RKMethods.CHC3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.CHC3")],-1)),a[418]||(a[418]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[419]||(a[419]=e(`julia CHC3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Chebyshev quadrature and C(3) satisfied. Note this equals Lobatto IIIA.
source
`,3))]),t("details",b4,[t("summary",null,[a[420]||(a[420]=t("a",{id:"IncompressibleNavierStokes.RKMethods.CHC5",href:"#IncompressibleNavierStokes.RKMethods.CHC5"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.CHC5")],-1)),a[421]||(a[421]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[422]||(a[422]=e(`julia CHC5 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
CHC5.
source
`,3))]),a[487]||(a[487]=t("h3",{id:"Miscellaneous-Methods",tabindex:"-1"},[s("Miscellaneous Methods "),t("a",{class:"header-anchor",href:"#Miscellaneous-Methods","aria-label":'Permalink to "Miscellaneous Methods {#Miscellaneous-Methods}"'},"")],-1)),t("details",x4,[t("summary",null,[a[423]||(a[423]=t("a",{id:"IncompressibleNavierStokes.RKMethods.Mid22",href:"#IncompressibleNavierStokes.RKMethods.Mid22"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.Mid22")],-1)),a[424]||(a[424]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[425]||(a[425]=e(`julia Mid22 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Midpoint 22 method.
source
`,3))]),t("details",f4,[t("summary",null,[a[426]||(a[426]=t("a",{id:"IncompressibleNavierStokes.RKMethods.MTE22",href:"#IncompressibleNavierStokes.RKMethods.MTE22"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.MTE22")],-1)),a[427]||(a[427]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[428]||(a[428]=e(`julia MTE22 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Minimal truncation error 22 method (Heun).
source
`,3))]),t("details",M4,[t("summary",null,[a[429]||(a[429]=t("a",{id:"IncompressibleNavierStokes.RKMethods.CN22",href:"#IncompressibleNavierStokes.RKMethods.CN22"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.CN22")],-1)),a[430]||(a[430]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[431]||(a[431]=e(`julia CN22 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Crank-Nicholson.
source
`,3))]),t("details",L4,[t("summary",null,[a[432]||(a[432]=t("a",{id:"IncompressibleNavierStokes.RKMethods.Heun33",href:"#IncompressibleNavierStokes.RKMethods.Heun33"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.Heun33")],-1)),a[433]||(a[433]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[434]||(a[434]=e(`julia Heun33 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Heun33.
source
`,3))]),t("details",v4,[t("summary",null,[a[435]||(a[435]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK33C2",href:"#IncompressibleNavierStokes.RKMethods.RK33C2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK33C2")],-1)),a[436]||(a[436]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[437]||(a[437]=e(`julia RK33C2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RK3 satisfying C(2) for i=3.
source
`,3))]),t("details",E4,[t("summary",null,[a[438]||(a[438]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK33P2",href:"#IncompressibleNavierStokes.RKMethods.RK33P2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK33P2")],-1)),a[439]||(a[439]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[440]||(a[440]=e(`julia RK33P2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RK3 satisfying the second order condition for the pressure.
source
`,3))]),t("details",Z4,[t("summary",null,[a[441]||(a[441]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK44",href:"#IncompressibleNavierStokes.RKMethods.RK44"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK44")],-1)),a[442]||(a[442]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[443]||(a[443]=e(`julia RK44 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Classical fourth order.
source
`,3))]),t("details",j4,[t("summary",null,[a[444]||(a[444]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK44C2",href:"#IncompressibleNavierStokes.RKMethods.RK44C2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK44C2")],-1)),a[445]||(a[445]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[446]||(a[446]=e(`julia RK44C2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RK4 satisfying C(2) for i=3.
source
`,3))]),t("details",D4,[t("summary",null,[a[447]||(a[447]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK44C23",href:"#IncompressibleNavierStokes.RKMethods.RK44C23"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK44C23")],-1)),a[448]||(a[448]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[449]||(a[449]=e(`julia RK44C23 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RK4 satisfying C(2) for i=3 and c2=c3.
source
`,3))]),t("details",S4,[t("summary",null,[a[450]||(a[450]=t("a",{id:"IncompressibleNavierStokes.RKMethods.RK44P2",href:"#IncompressibleNavierStokes.RKMethods.RK44P2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.RK44P2")],-1)),a[451]||(a[451]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[452]||(a[452]=e(`julia RK44P2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
RK4 satisfying the second order condition for the pressure (but not third order).
source
`,3))]),a[488]||(a[488]=t("h3",{id:"DSRK-Methods",tabindex:"-1"},[s("DSRK Methods "),t("a",{class:"header-anchor",href:"#DSRK-Methods","aria-label":'Permalink to "DSRK Methods {#DSRK-Methods}"'},"")],-1)),t("details",V4,[t("summary",null,[a[453]||(a[453]=t("a",{id:"IncompressibleNavierStokes.RKMethods.DSso2",href:"#IncompressibleNavierStokes.RKMethods.DSso2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.DSso2")],-1)),a[454]||(a[454]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[455]||(a[455]=e(`julia DSso2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
CBM's DSRKso2.
source
`,3))]),t("details",I4,[t("summary",null,[a[456]||(a[456]=t("a",{id:"IncompressibleNavierStokes.RKMethods.DSRK2",href:"#IncompressibleNavierStokes.RKMethods.DSRK2"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.DSRK2")],-1)),a[457]||(a[457]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[458]||(a[458]=e(`julia DSRK2 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
CBM's DSRK2.
source
`,3))]),t("details",R4,[t("summary",null,[a[459]||(a[459]=t("a",{id:"IncompressibleNavierStokes.RKMethods.DSRK3",href:"#IncompressibleNavierStokes.RKMethods.DSRK3"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.DSRK3")],-1)),a[460]||(a[460]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[461]||(a[461]=e(`julia DSRK3 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
Zennaro's DSRK3.
source
`,3))]),a[489]||(a[489]=t("h3",{id:"Non-SSP-Methods-of-Wong-and-Spiteri",tabindex:"-1"},[s('"Non-SSP" Methods of Wong & Spiteri '),t("a",{class:"header-anchor",href:"#Non-SSP-Methods-of-Wong-and-Spiteri","aria-label":'Permalink to ""Non-SSP" Methods of Wong & Spiteri {#"Non-SSP"-Methods-of-Wong-and-Spiteri}"'},"")],-1)),t("details",F4,[t("summary",null,[a[462]||(a[462]=t("a",{id:"IncompressibleNavierStokes.RKMethods.NSSP21",href:"#IncompressibleNavierStokes.RKMethods.NSSP21"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.NSSP21")],-1)),a[463]||(a[463]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[464]||(a[464]=e(`julia NSSP21 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
NSSP21.
source
`,3))]),t("details",C4,[t("summary",null,[a[465]||(a[465]=t("a",{id:"IncompressibleNavierStokes.RKMethods.NSSP32",href:"#IncompressibleNavierStokes.RKMethods.NSSP32"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.NSSP32")],-1)),a[466]||(a[466]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[467]||(a[467]=e(`julia NSSP32 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
NSSP32.
source
`,3))]),t("details",N4,[t("summary",null,[a[468]||(a[468]=t("a",{id:"IncompressibleNavierStokes.RKMethods.NSSP33",href:"#IncompressibleNavierStokes.RKMethods.NSSP33"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.NSSP33")],-1)),a[469]||(a[469]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[470]||(a[470]=e(`julia NSSP33 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
NSSP33.
source
`,3))]),t("details",K4,[t("summary",null,[a[471]||(a[471]=t("a",{id:"IncompressibleNavierStokes.RKMethods.NSSP53",href:"#IncompressibleNavierStokes.RKMethods.NSSP53"},[t("span",{class:"jlbinding"},"IncompressibleNavierStokes.RKMethods.NSSP53")],-1)),a[472]||(a[472]=s()),i(T,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),a[473]||(a[473]=e(`julia NSSP53 (
+;
+ kwargs ...
+) -> Union{IncompressibleNavierStokes . ExplicitRungeKuttaMethod{Float64}, IncompressibleNavierStokes . ImplicitRungeKuttaMethod{Float64}}
NSSP53.
source
`,3))])])}const X4=n(r,[["render",A4]]);export{U4 as __pageData,X4 as default};
diff --git a/previews/PR126/assets/manual_utils.md.CN3AVUha.js b/previews/PR126/assets/manual_utils.md.CN3AVUha.js
new file mode 100644
index 00000000..48c48b35
--- /dev/null
+++ b/previews/PR126/assets/manual_utils.md.CN3AVUha.js
@@ -0,0 +1,11 @@
+import{_ as r,c as n,j as i,a as e,G as l,a5 as t,B as o,o as p}from"./chunks/framework.BSoZtefh.js";const F=JSON.parse('{"title":"Utils","description":"","frontmatter":{},"headers":[],"relativePath":"manual/utils.md","filePath":"manual/utils.md","lastUpdated":null}'),d={name:"manual/utils.md"},k={class:"jldocstring custom-block",open:""},h={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.489ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.779ex",height:"1.995ex",role:"img",focusable:"false",viewBox:"0 -666 2996.4 882","aria-hidden":"true"},u={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function T(f,s,v,Q,j,x){const a=o("Badge");return p(),n("div",null,[s[32]||(s[32]=i("h1",{id:"utils",tabindex:"-1"},[e("Utils "),i("a",{class:"header-anchor",href:"#utils","aria-label":'Permalink to "Utils"'},"")],-1)),i("details",k,[i("summary",null,[s[0]||(s[0]=i("a",{id:"IncompressibleNavierStokes.get_lims",href:"#IncompressibleNavierStokes.get_lims"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.get_lims")],-1)),s[1]||(s[1]=e()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[12]||(s[12]=t(`julia get_lims (x) -> Tuple{Any, Any}
+get_lims (x, n) -> Tuple{Any, Any}
`,1)),i("p",null,[s[4]||(s[4]=e("Get approximate lower and upper limits of a field ")),s[5]||(s[5]=i("code",null,"x",-1)),s[6]||(s[6]=e(" based on the mean and standard deviation (")),i("mjx-container",h,[(p(),n("svg",g,s[2]||(s[2]=[t(' ',1)]))),s[3]||(s[3]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"μ"),i("mo",null,"±"),i("mi",null,"n"),i("mi",null,"σ")])],-1))]),s[7]||(s[7]=e("). If ")),s[8]||(s[8]=i("code",null,"x",-1)),s[9]||(s[9]=e(" is constant, a margin of ")),s[10]||(s[10]=i("code",null,"1e-4",-1)),s[11]||(s[11]=e(" is enforced. This is required for contour plotting functions that require a certain range."))]),s[13]||(s[13]=i("p",null,[i("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/utils.jl#L13",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",u,[i("summary",null,[s[14]||(s[14]=i("a",{id:"IncompressibleNavierStokes.get_spectrum-Tuple{Any}",href:"#IncompressibleNavierStokes.get_spectrum-Tuple{Any}"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.get_spectrum")],-1)),s[15]||(s[15]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[16]||(s[16]=t(`julia get_spectrum (
+ setup;
+ npoint,
+ a
+) -> NamedTuple{( :κ , :masks , :K ), <: Tuple{Any, Any, Any} }
Get energy spectrum of velocity field.
source
`,3))]),i("details",b,[i("summary",null,[s[17]||(s[17]=i("a",{id:"IncompressibleNavierStokes.getoffset-Tuple{Any}",href:"#IncompressibleNavierStokes.getoffset-Tuple{Any}"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.getoffset")],-1)),s[18]||(s[18]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[19]||(s[19]=t('Get offset from CartesianIndices
I
.
source
',3))]),i("details",c,[i("summary",null,[s[20]||(s[20]=i("a",{id:"IncompressibleNavierStokes.getval-Union{Tuple{Val{x}}, Tuple{x}} where x",href:"#IncompressibleNavierStokes.getval-Union{Tuple{Val{x}}, Tuple{x}} where x"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.getval")],-1)),s[21]||(s[21]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[22]||(s[22]=t('julia getval (_ :: Val{x} ) -> Any
Get value contained in Val
.
source
',3))]),i("details",m,[i("summary",null,[s[23]||(s[23]=i("a",{id:"IncompressibleNavierStokes.plotgrid",href:"#IncompressibleNavierStokes.plotgrid"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.plotgrid")],-1)),s[24]||(s[24]=e()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[25]||(s[25]=t(`julia plotgrid (x, y; kwargs ... )
+plotgrid (x, y, z)
Plot nonuniform Cartesian grid.
source
`,3))]),i("details",E,[i("summary",null,[s[26]||(s[26]=i("a",{id:"IncompressibleNavierStokes.spectral_stuff-Tuple{Any}",href:"#IncompressibleNavierStokes.spectral_stuff-Tuple{Any}"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.spectral_stuff")],-1)),s[27]||(s[27]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[28]||(s[28]=t(`julia spectral_stuff (
+ setup;
+ npoint,
+ a
+) -> NamedTuple{( :inds , :κ , :K ), <: Tuple{Any, Any, Any} }
Get utilities to compute energy spectrum.
source
`,3))]),i("details",y,[i("summary",null,[s[29]||(s[29]=i("a",{id:"IncompressibleNavierStokes.splitseed-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.splitseed-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.splitseed")],-1)),s[30]||(s[30]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[31]||(s[31]=t('julia splitseed (seed, n) -> AbstractArray
Split random number generator seed into n
new seeds.
source
',3))])])}const A=r(d,[["render",T]]);export{F as __pageData,A as default};
diff --git a/previews/PR126/assets/manual_utils.md.CN3AVUha.lean.js b/previews/PR126/assets/manual_utils.md.CN3AVUha.lean.js
new file mode 100644
index 00000000..48c48b35
--- /dev/null
+++ b/previews/PR126/assets/manual_utils.md.CN3AVUha.lean.js
@@ -0,0 +1,11 @@
+import{_ as r,c as n,j as i,a as e,G as l,a5 as t,B as o,o as p}from"./chunks/framework.BSoZtefh.js";const F=JSON.parse('{"title":"Utils","description":"","frontmatter":{},"headers":[],"relativePath":"manual/utils.md","filePath":"manual/utils.md","lastUpdated":null}'),d={name:"manual/utils.md"},k={class:"jldocstring custom-block",open:""},h={class:"MathJax",jax:"SVG",style:{direction:"ltr",position:"relative"}},g={style:{overflow:"visible","min-height":"1px","min-width":"1px","vertical-align":"-0.489ex"},xmlns:"http://www.w3.org/2000/svg",width:"6.779ex",height:"1.995ex",role:"img",focusable:"false",viewBox:"0 -666 2996.4 882","aria-hidden":"true"},u={class:"jldocstring custom-block",open:""},b={class:"jldocstring custom-block",open:""},c={class:"jldocstring custom-block",open:""},m={class:"jldocstring custom-block",open:""},E={class:"jldocstring custom-block",open:""},y={class:"jldocstring custom-block",open:""};function T(f,s,v,Q,j,x){const a=o("Badge");return p(),n("div",null,[s[32]||(s[32]=i("h1",{id:"utils",tabindex:"-1"},[e("Utils "),i("a",{class:"header-anchor",href:"#utils","aria-label":'Permalink to "Utils"'},"")],-1)),i("details",k,[i("summary",null,[s[0]||(s[0]=i("a",{id:"IncompressibleNavierStokes.get_lims",href:"#IncompressibleNavierStokes.get_lims"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.get_lims")],-1)),s[1]||(s[1]=e()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[12]||(s[12]=t(`julia get_lims (x) -> Tuple{Any, Any}
+get_lims (x, n) -> Tuple{Any, Any}
`,1)),i("p",null,[s[4]||(s[4]=e("Get approximate lower and upper limits of a field ")),s[5]||(s[5]=i("code",null,"x",-1)),s[6]||(s[6]=e(" based on the mean and standard deviation (")),i("mjx-container",h,[(p(),n("svg",g,s[2]||(s[2]=[t(' ',1)]))),s[3]||(s[3]=i("mjx-assistive-mml",{unselectable:"on",display:"inline",style:{top:"0px",left:"0px",clip:"rect(1px, 1px, 1px, 1px)","-webkit-touch-callout":"none","-webkit-user-select":"none","-khtml-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none",position:"absolute",padding:"1px 0px 0px 0px",border:"0px",display:"block",width:"auto",overflow:"hidden"}},[i("math",{xmlns:"http://www.w3.org/1998/Math/MathML"},[i("mi",null,"μ"),i("mo",null,"±"),i("mi",null,"n"),i("mi",null,"σ")])],-1))]),s[7]||(s[7]=e("). If ")),s[8]||(s[8]=i("code",null,"x",-1)),s[9]||(s[9]=e(" is constant, a margin of ")),s[10]||(s[10]=i("code",null,"1e-4",-1)),s[11]||(s[11]=e(" is enforced. This is required for contour plotting functions that require a certain range."))]),s[13]||(s[13]=i("p",null,[i("a",{href:"https://github.com/agdestein/IncompressibleNavierStokes.jl/blob/505e79d2b6bbbc243eed9b17029223fcc45d6236/src/utils.jl#L13",target:"_blank",rel:"noreferrer"},"source")],-1))]),i("details",u,[i("summary",null,[s[14]||(s[14]=i("a",{id:"IncompressibleNavierStokes.get_spectrum-Tuple{Any}",href:"#IncompressibleNavierStokes.get_spectrum-Tuple{Any}"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.get_spectrum")],-1)),s[15]||(s[15]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[16]||(s[16]=t(`julia get_spectrum (
+ setup;
+ npoint,
+ a
+) -> NamedTuple{( :κ , :masks , :K ), <: Tuple{Any, Any, Any} }
Get energy spectrum of velocity field.
source
`,3))]),i("details",b,[i("summary",null,[s[17]||(s[17]=i("a",{id:"IncompressibleNavierStokes.getoffset-Tuple{Any}",href:"#IncompressibleNavierStokes.getoffset-Tuple{Any}"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.getoffset")],-1)),s[18]||(s[18]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[19]||(s[19]=t('Get offset from CartesianIndices
I
.
source
',3))]),i("details",c,[i("summary",null,[s[20]||(s[20]=i("a",{id:"IncompressibleNavierStokes.getval-Union{Tuple{Val{x}}, Tuple{x}} where x",href:"#IncompressibleNavierStokes.getval-Union{Tuple{Val{x}}, Tuple{x}} where x"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.getval")],-1)),s[21]||(s[21]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[22]||(s[22]=t('julia getval (_ :: Val{x} ) -> Any
Get value contained in Val
.
source
',3))]),i("details",m,[i("summary",null,[s[23]||(s[23]=i("a",{id:"IncompressibleNavierStokes.plotgrid",href:"#IncompressibleNavierStokes.plotgrid"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.plotgrid")],-1)),s[24]||(s[24]=e()),l(a,{type:"info",class:"jlObjectType jlFunction",text:"Function"})]),s[25]||(s[25]=t(`julia plotgrid (x, y; kwargs ... )
+plotgrid (x, y, z)
Plot nonuniform Cartesian grid.
source
`,3))]),i("details",E,[i("summary",null,[s[26]||(s[26]=i("a",{id:"IncompressibleNavierStokes.spectral_stuff-Tuple{Any}",href:"#IncompressibleNavierStokes.spectral_stuff-Tuple{Any}"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.spectral_stuff")],-1)),s[27]||(s[27]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[28]||(s[28]=t(`julia spectral_stuff (
+ setup;
+ npoint,
+ a
+) -> NamedTuple{( :inds , :κ , :K ), <: Tuple{Any, Any, Any} }
Get utilities to compute energy spectrum.
source
`,3))]),i("details",y,[i("summary",null,[s[29]||(s[29]=i("a",{id:"IncompressibleNavierStokes.splitseed-Tuple{Any, Any}",href:"#IncompressibleNavierStokes.splitseed-Tuple{Any, Any}"},[i("span",{class:"jlbinding"},"IncompressibleNavierStokes.splitseed")],-1)),s[30]||(s[30]=e()),l(a,{type:"info",class:"jlObjectType jlMethod",text:"Method"})]),s[31]||(s[31]=t('julia splitseed (seed, n) -> AbstractArray
Split random number generator seed into n
new seeds.
source
',3))])])}const A=r(d,[["render",T]]);export{F as __pageData,A as default};
diff --git a/previews/PR126/assets/mqehavm.B0GX2W7p.png b/previews/PR126/assets/mqehavm.B0GX2W7p.png
new file mode 100644
index 00000000..990864b3
Binary files /dev/null and b/previews/PR126/assets/mqehavm.B0GX2W7p.png differ
diff --git a/previews/PR126/assets/ncjebvf.Ckr30c9N.png b/previews/PR126/assets/ncjebvf.Ckr30c9N.png
new file mode 100644
index 00000000..05814c3b
Binary files /dev/null and b/previews/PR126/assets/ncjebvf.Ckr30c9N.png differ
diff --git a/previews/PR126/assets/references.md.BG5rX2tb.js b/previews/PR126/assets/references.md.BG5rX2tb.js
new file mode 100644
index 00000000..f517a8b5
--- /dev/null
+++ b/previews/PR126/assets/references.md.BG5rX2tb.js
@@ -0,0 +1 @@
+import{_ as r,c as a,a5 as t,o}from"./chunks/framework.BSoZtefh.js";const h=JSON.parse('{"title":"References","description":"","frontmatter":{},"headers":[],"relativePath":"references.md","filePath":"references.md","lastUpdated":null}'),i={name:"references.md"};function n(l,e,s,p,c,f){return o(),a("div",null,e[0]||(e[0]=[t('References Bibliography D. Kochkov, J. A. Smith, A. Alieva, Q. Wang, M. P. Brenner and S. Hoyer. Machine learning-accelerated computational fluid dynamics . Proceedings of the National Academy of Sciences 118 (2021).
M. Kurz, P. Offenhäuser and A. Beck. Deep Reinforcement Learning for Turbulence Modeling in Large Eddy Simulations , arXiv (2022).
B. List, L.-W. Chen and N. Thuerey. Learned Turbulence Modelling with Differentiable Fluid Solvers , arxiv:2202.06988 (2022).
J. F. MacArt, J. Sirignano and J. B. Freund. Embedded training of neural-network sub-grid-scale turbulence models (2021 ).
J. Li and P. M. Carrica. A simple approach for vortex core visualization , arXiv:1910.06998 (2019), arXiv:1910.06998 [physics.flu-dyn] .
J. Jeong and F. Hussain. On the identification of a vortex . J. Fluid. Mech. 285 , 69–94 (1995).
S. B. Pope. Turbulent Flows (Cambridge University Press, Cambridge, England, 2000).
B. Sanderse and F. X. Trias. Energy-consistent discretization of viscous dissipation with application to natural convection flow (Jul 2023), arXiv:2307.10874v1 [physics.flu-dyn] .
M. H. Silvis, R. A. Remmerswaal and R. Verstappen. Physical consistency of subgrid-scale models for large-eddy simulation of incompressible turbulent flows . Physics of Fluids 29 (2017).
F. X. TRIAS, M. SORIA, A. OLIVA and C. D. PÉREZ-SEGARRA. Direct numerical simulations of two- and three-dimensional turbulent natural convection flows in a differentially heated cavity of aspect ratio 4 . Journal of Fluid Mechanics 586 , 259–293 (2007).
P. Orlandi. Fluid flow phenomena: a numerical toolkit . Vol. 55 (Springer Science & Business Media, 2000).
O. San and A. E. Staples. High-order methods for decaying two-dimensional homogeneous isotropic turbulence . Computers & Fluids 63 , 105–127 (2012).
F. H. Harlow and J. E. Welch. * Numerical Calculation of Time‐Dependent Viscous Incompressible Flow of Fluid with Free Surface * . The Physics of Fluids 8 , 2182–2189 (1965), arXiv:https://aip.scitation.org/doi/pdf/10.1063/1.1761178 .
R. W. Verstappen and A. E. Veldman. Symmetry-Preserving Discretization of Turbulent Flow . J. Comput. Phys. 187 , 343–368 (2003).
B. Sanderse, R. Verstappen and B. Koren. Boundary treatment for fourth-order staggered mesh discretizations of the incompressible Navier–Stokes equations . Journal of Computational Physics 257 , 1472–1505 (2014). Physics-compatible numerical methods.
R. Verstappen and A. Veldman. Direct Numerical Simulation of Turbulence at Lower Costs . Journal of Engineering Mathematics 32 , 143–159 (1997).
B. Sanderse and B. Koren. Accuracy analysis of explicit Runge–Kutta methods applied to the incompressible Navier–Stokes equations . Journal of Computational Physics 231 , 3041–3063 (2012).
B. Sanderse. Energy-conserving Runge–Kutta methods for the incompressible Navier–Stokes equations . Journal of Computational Physics 233 , 100–131 (2013).
',4)]))}const g=r(i,[["render",n]]);export{h as __pageData,g as default};
diff --git a/previews/PR126/assets/references.md.BG5rX2tb.lean.js b/previews/PR126/assets/references.md.BG5rX2tb.lean.js
new file mode 100644
index 00000000..f517a8b5
--- /dev/null
+++ b/previews/PR126/assets/references.md.BG5rX2tb.lean.js
@@ -0,0 +1 @@
+import{_ as r,c as a,a5 as t,o}from"./chunks/framework.BSoZtefh.js";const h=JSON.parse('{"title":"References","description":"","frontmatter":{},"headers":[],"relativePath":"references.md","filePath":"references.md","lastUpdated":null}'),i={name:"references.md"};function n(l,e,s,p,c,f){return o(),a("div",null,e[0]||(e[0]=[t('References Bibliography D. Kochkov, J. A. Smith, A. Alieva, Q. Wang, M. P. Brenner and S. Hoyer. Machine learning-accelerated computational fluid dynamics . Proceedings of the National Academy of Sciences 118 (2021).
M. Kurz, P. Offenhäuser and A. Beck. Deep Reinforcement Learning for Turbulence Modeling in Large Eddy Simulations , arXiv (2022).
B. List, L.-W. Chen and N. Thuerey. Learned Turbulence Modelling with Differentiable Fluid Solvers , arxiv:2202.06988 (2022).
J. F. MacArt, J. Sirignano and J. B. Freund. Embedded training of neural-network sub-grid-scale turbulence models (2021 ).
J. Li and P. M. Carrica. A simple approach for vortex core visualization , arXiv:1910.06998 (2019), arXiv:1910.06998 [physics.flu-dyn] .
J. Jeong and F. Hussain. On the identification of a vortex . J. Fluid. Mech. 285 , 69–94 (1995).
S. B. Pope. Turbulent Flows (Cambridge University Press, Cambridge, England, 2000).
B. Sanderse and F. X. Trias. Energy-consistent discretization of viscous dissipation with application to natural convection flow (Jul 2023), arXiv:2307.10874v1 [physics.flu-dyn] .
M. H. Silvis, R. A. Remmerswaal and R. Verstappen. Physical consistency of subgrid-scale models for large-eddy simulation of incompressible turbulent flows . Physics of Fluids 29 (2017).
F. X. TRIAS, M. SORIA, A. OLIVA and C. D. PÉREZ-SEGARRA. Direct numerical simulations of two- and three-dimensional turbulent natural convection flows in a differentially heated cavity of aspect ratio 4 . Journal of Fluid Mechanics 586 , 259–293 (2007).
P. Orlandi. Fluid flow phenomena: a numerical toolkit . Vol. 55 (Springer Science & Business Media, 2000).
O. San and A. E. Staples. High-order methods for decaying two-dimensional homogeneous isotropic turbulence . Computers & Fluids 63 , 105–127 (2012).
F. H. Harlow and J. E. Welch. * Numerical Calculation of Time‐Dependent Viscous Incompressible Flow of Fluid with Free Surface * . The Physics of Fluids 8 , 2182–2189 (1965), arXiv:https://aip.scitation.org/doi/pdf/10.1063/1.1761178 .
R. W. Verstappen and A. E. Veldman. Symmetry-Preserving Discretization of Turbulent Flow . J. Comput. Phys. 187 , 343–368 (2003).
B. Sanderse, R. Verstappen and B. Koren. Boundary treatment for fourth-order staggered mesh discretizations of the incompressible Navier–Stokes equations . Journal of Computational Physics 257 , 1472–1505 (2014). Physics-compatible numerical methods.
R. Verstappen and A. Veldman. Direct Numerical Simulation of Turbulence at Lower Costs . Journal of Engineering Mathematics 32 , 143–159 (1997).
B. Sanderse and B. Koren. Accuracy analysis of explicit Runge–Kutta methods applied to the incompressible Navier–Stokes equations . Journal of Computational Physics 231 , 3041–3063 (2012).
B. Sanderse. Energy-conserving Runge–Kutta methods for the incompressible Navier–Stokes equations . Journal of Computational Physics 233 , 100–131 (2013).
',4)]))}const g=r(i,[["render",n]]);export{h as __pageData,g as default};
diff --git a/previews/PR126/assets/resolution.DAYTxiG0.png b/previews/PR126/assets/resolution.DAYTxiG0.png
new file mode 100644
index 00000000..af544cc4
Binary files /dev/null and b/previews/PR126/assets/resolution.DAYTxiG0.png differ
diff --git a/previews/PR126/assets/smpfhbj.J4Xy6kEr.png b/previews/PR126/assets/smpfhbj.J4Xy6kEr.png
new file mode 100644
index 00000000..4e4bf686
Binary files /dev/null and b/previews/PR126/assets/smpfhbj.J4Xy6kEr.png differ
diff --git a/previews/PR126/assets/style.BAVfFGJP.css b/previews/PR126/assets/style.BAVfFGJP.css
new file mode 100644
index 00000000..ef41508d
--- /dev/null
+++ b/previews/PR126/assets/style.BAVfFGJP.css
@@ -0,0 +1 @@
+.img-box[data-v-f778be06]{box-sizing:content-box;border-radius:14px;margin:20px;height:230px;width:230px;overflow:hidden;display:inline-block;color:#fff;position:relative;background-color:transparent;border:2px solid var(--vp-c-bg-alt)}.img-box h2[data-v-f778be06]{border-top:0}.img-box img[data-v-f778be06]{height:100%;width:100%;object-fit:cover;opacity:.3;transition:transform .3s ease,opacity .3s ease}.caption[data-v-f778be06]{position:absolute;bottom:30px;color:var(--vp-c-text-1);left:10px;opacity:1;transition:transform .3s ease,opacity .3s ease}.subcaption[data-v-f778be06]{position:absolute;bottom:5px;color:var(--vp-c-text-1);left:10px;opacity:0;transition:transform .3s ease,opacity .3s ease}.transparent-box1[data-v-f778be06]{height:160px;width:230px;background-color:transparent;position:absolute;top:0;left:0;transition:background-color .3s ease}.transparent-box2[data-v-f778be06]{height:70px;width:230px;background-color:transparent;position:absolute;top:160px;left:0;transition:background-color .3s ease}.img-box:hover img[data-v-f778be06]{transform:scale(1.1)}.img-box:hover .transparent-box1[data-v-f778be06],.img-box:hover .transparent-box2[data-v-f778be06]{background-color:var(--vp-c-bg-alt)}.img-box:hover .caption[data-v-f778be06],.img-box:hover .subcaption[data-v-f778be06]{transform:translateY(-20px);opacity:1}.img-box[data-v-f778be06]:hover{border:2px solid var(--vp-c-brand-light);cursor:pointer}.caption>p[data-v-f778be06]:nth-child(2){font-size:.8em}.subcaption>p[data-v-f778be06]:nth-child(2){font-size:.8em}.opacity-low[data-v-f778be06]{opacity:.85}.heading[data-v-9f22d17b]{text-align:center;font-size:2em;letter-spacing:1px;padding:40px;color:#fff}.gallery-image[data-v-9f22d17b]{padding:20px;display:flex;flex-wrap:wrap;justify-content:center}.gallery-image[data-v-9f22d17b] img{height:230px;width:230px;transform:scale(1);transition:transform .4s ease}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/IncompressibleNavierStokes.jl/previews/PR126/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;-webkit-user-select:none;user-select:none;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-b06cdb19]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-b06cdb19],.VPBackdrop.fade-leave-to[data-v-b06cdb19]{opacity:0}.VPBackdrop.fade-leave-active[data-v-b06cdb19]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-b06cdb19]{display:none}}.NotFound[data-v-951cab6c]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-951cab6c]{padding:96px 32px 168px}}.code[data-v-951cab6c]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-951cab6c]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-951cab6c]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-951cab6c]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-951cab6c]{padding-top:20px}.link[data-v-951cab6c]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-951cab6c]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-3f927ebe]{position:relative;z-index:1}.nested[data-v-3f927ebe]{padding-right:16px;padding-left:16px}.outline-link[data-v-3f927ebe]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-3f927ebe]:hover,.outline-link.active[data-v-3f927ebe]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-3f927ebe]{padding-left:13px}.VPDocAsideOutline[data-v-b38bf2ff]{display:none}.VPDocAsideOutline.has-outline[data-v-b38bf2ff]{display:block}.content[data-v-b38bf2ff]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-b38bf2ff]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-b38bf2ff]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-6d7b3c46]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-6d7b3c46]{flex-grow:1}.VPDocAside[data-v-6d7b3c46] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-6d7b3c46] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-6d7b3c46] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-475f71b8]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-475f71b8]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-4f9813fa]{margin-top:64px}.edit-info[data-v-4f9813fa]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-4f9813fa]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-4f9813fa]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-4f9813fa]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-4f9813fa]{margin-right:8px}.prev-next[data-v-4f9813fa]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-4f9813fa]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-4f9813fa]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-4f9813fa]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-4f9813fa]{margin-left:auto;text-align:right}.desc[data-v-4f9813fa]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-4f9813fa]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-83890dd9]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-83890dd9]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-83890dd9]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-83890dd9]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-83890dd9]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-83890dd9]{display:flex;justify-content:center}.VPDoc .aside[data-v-83890dd9]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-83890dd9]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-83890dd9]{max-width:1104px}}.container[data-v-83890dd9]{margin:0 auto;width:100%}.aside[data-v-83890dd9]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-83890dd9]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-83890dd9]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-83890dd9]::-webkit-scrollbar{display:none}.aside-curtain[data-v-83890dd9]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-83890dd9]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-83890dd9]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-83890dd9]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-83890dd9]{order:1;margin:0;min-width:640px}}.content-container[data-v-83890dd9]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-83890dd9]{max-width:688px}.VPButton[data-v-906d7fb4]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-906d7fb4]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-906d7fb4]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-906d7fb4]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-906d7fb4]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-906d7fb4]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-906d7fb4]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-906d7fb4]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-906d7fb4]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-906d7fb4]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-906d7fb4]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-906d7fb4]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-906d7fb4]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-35a7d0b8]{display:none}.dark .VPImage.light[data-v-35a7d0b8]{display:none}.VPHero[data-v-955009fc]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-955009fc]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-955009fc]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-955009fc]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-955009fc]{flex-direction:row}}.main[data-v-955009fc]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-955009fc]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-955009fc]{text-align:left}}@media (min-width: 960px){.main[data-v-955009fc]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-955009fc]{max-width:592px}}.name[data-v-955009fc],.text[data-v-955009fc]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-955009fc],.VPHero.has-image .text[data-v-955009fc]{margin:0 auto}.name[data-v-955009fc]{color:var(--vp-home-hero-name-color)}.clip[data-v-955009fc]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-955009fc],.text[data-v-955009fc]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-955009fc],.text[data-v-955009fc]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-955009fc],.VPHero.has-image .text[data-v-955009fc]{margin:0}}.tagline[data-v-955009fc]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-955009fc]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-955009fc]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-955009fc]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-955009fc]{margin:0}}.actions[data-v-955009fc]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-955009fc]{justify-content:center}@media (min-width: 640px){.actions[data-v-955009fc]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-955009fc]{justify-content:flex-start}}.action[data-v-955009fc]{flex-shrink:0;padding:6px}.image[data-v-955009fc]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-955009fc]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-955009fc]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-955009fc]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-955009fc]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-955009fc]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-955009fc]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-955009fc]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-955009fc]{width:320px;height:320px}}[data-v-955009fc] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-955009fc] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-955009fc] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-f5e9645b]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-f5e9645b]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-f5e9645b]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-f5e9645b]>.VPImage{margin-bottom:20px}.icon[data-v-f5e9645b]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-f5e9645b]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-f5e9645b]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-f5e9645b]{padding-top:8px}.link-text-value[data-v-f5e9645b]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-f5e9645b]{margin-left:6px}.VPFeatures[data-v-d0a190d7]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-d0a190d7]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-d0a190d7]{padding:0 64px}}.container[data-v-d0a190d7]{margin:0 auto;max-width:1152px}.items[data-v-d0a190d7]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-d0a190d7]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-d0a190d7],.item.grid-4[data-v-d0a190d7],.item.grid-6[data-v-d0a190d7]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-d0a190d7],.item.grid-4[data-v-d0a190d7]{width:50%}.item.grid-3[data-v-d0a190d7],.item.grid-6[data-v-d0a190d7]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-d0a190d7]{width:25%}}.container[data-v-7a48a447]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-7a48a447]{padding:0 48px}}@media (min-width: 960px){.container[data-v-7a48a447]{width:100%;padding:0 64px}}.vp-doc[data-v-7a48a447] .VPHomeSponsors,.vp-doc[data-v-7a48a447] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-7a48a447] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-7a48a447] .VPHomeSponsors a,.vp-doc[data-v-7a48a447] .VPTeamPage a{text-decoration:none}.VPHome[data-v-cbb6ec48]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-cbb6ec48]{margin-bottom:128px}}.VPContent[data-v-91765379]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-91765379]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-91765379]{margin:0}@media (min-width: 960px){.VPContent[data-v-91765379]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-91765379]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-91765379]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-c970a860]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-c970a860]{display:none}.VPFooter[data-v-c970a860] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-c970a860] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-c970a860]{padding:32px}}.container[data-v-c970a860]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-c970a860],.copyright[data-v-c970a860]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-bc9dc845]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-bc9dc845]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-bc9dc845]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-bc9dc845]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-bc9dc845]{color:var(--vp-c-text-1)}.icon[data-v-bc9dc845]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-bc9dc845]{font-size:14px}.icon[data-v-bc9dc845]{font-size:16px}}.open>.icon[data-v-bc9dc845]{transform:rotate(90deg)}.items[data-v-bc9dc845]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-bc9dc845]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-bc9dc845]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-bc9dc845]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-bc9dc845]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-bc9dc845]{transition:all .2s ease-out}.flyout-leave-active[data-v-bc9dc845]{transition:all .15s ease-in}.flyout-enter-from[data-v-bc9dc845],.flyout-leave-to[data-v-bc9dc845]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-070ab83d]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-070ab83d]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-070ab83d]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-070ab83d]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-070ab83d]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-070ab83d]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-070ab83d]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-070ab83d]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-070ab83d]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-070ab83d]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-070ab83d]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-070ab83d]{display:none}}.menu-icon[data-v-070ab83d]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-070ab83d]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-070ab83d]{padding:12px 32px 11px}}.VPSwitch[data-v-4a1c76db]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-4a1c76db]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-4a1c76db]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-4a1c76db]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-4a1c76db] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-4a1c76db] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-e40a8bb6]{opacity:1}.moon[data-v-e40a8bb6],.dark .sun[data-v-e40a8bb6]{opacity:0}.dark .moon[data-v-e40a8bb6]{opacity:1}.dark .VPSwitchAppearance[data-v-e40a8bb6] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-af096f4a]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-af096f4a]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-acbfed09]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-acbfed09]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-acbfed09]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-acbfed09]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-48c802d0]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-48c802d0]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-48c802d0]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-48c802d0]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-7dd3104a]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-7dd3104a] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-7dd3104a] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-7dd3104a] .group:last-child{padding-bottom:0}.VPMenu[data-v-7dd3104a] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-7dd3104a] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-7dd3104a] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-7dd3104a] .action{padding-left:24px}.VPFlyout[data-v-04f5c5e9]{position:relative}.VPFlyout[data-v-04f5c5e9]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-04f5c5e9]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-04f5c5e9]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-04f5c5e9]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-04f5c5e9]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-04f5c5e9]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-04f5c5e9],.button[aria-expanded=true]+.menu[data-v-04f5c5e9]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-04f5c5e9]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-04f5c5e9]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-04f5c5e9]{margin-right:0;font-size:16px}.text-icon[data-v-04f5c5e9]{margin-left:4px;font-size:14px}.icon[data-v-04f5c5e9]{font-size:20px;transition:fill .25s}.menu[data-v-04f5c5e9]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-d26d30cb]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-d26d30cb]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-d26d30cb]>svg,.VPSocialLink[data-v-d26d30cb]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-ee7a9424]{display:flex;justify-content:center}.VPNavBarExtra[data-v-925effce]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-925effce]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-925effce]{display:none}}.trans-title[data-v-925effce]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-925effce],.item.social-links[data-v-925effce]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-925effce]{min-width:176px}.appearance-action[data-v-925effce]{margin-right:-2px}.social-links-list[data-v-925effce]{margin:-4px -8px}.VPNavBarHamburger[data-v-5dea55bf]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-5dea55bf]{display:none}}.container[data-v-5dea55bf]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-5dea55bf]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-5dea55bf]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-5dea55bf]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-5dea55bf]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-5dea55bf]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-5dea55bf]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-5dea55bf],.VPNavBarHamburger.active:hover .middle[data-v-5dea55bf],.VPNavBarHamburger.active:hover .bottom[data-v-5dea55bf]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-5dea55bf],.middle[data-v-5dea55bf],.bottom[data-v-5dea55bf]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-5dea55bf]{top:0;left:0;transform:translate(0)}.middle[data-v-5dea55bf]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-5dea55bf]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-956ec74c]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-956ec74c],.VPNavBarMenuLink[data-v-956ec74c]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-e6d46098]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-e6d46098]{display:flex}}/*! @docsearch/css 3.8.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-164c457f]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-164c457f]{display:flex;align-items:center}}.title[data-v-0f4f798b]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-0f4f798b]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-0f4f798b]{border-bottom-color:var(--vp-c-divider)}}[data-v-0f4f798b] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-c80d9ad0]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-c80d9ad0]{display:flex;align-items:center}}.title[data-v-c80d9ad0]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-822684d1]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-822684d1]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-822684d1]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-822684d1]:not(.home){background-color:transparent}.VPNavBar[data-v-822684d1]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-822684d1]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-822684d1]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-822684d1]{padding:0}}.container[data-v-822684d1]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-822684d1],.container>.content[data-v-822684d1]{pointer-events:none}.container[data-v-822684d1] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-822684d1]{max-width:100%}}.title[data-v-822684d1]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-822684d1]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-822684d1]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-822684d1]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-822684d1]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-822684d1]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-822684d1]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-822684d1]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-822684d1]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-822684d1]{column-gap:.5rem}}.menu+.translations[data-v-822684d1]:before,.menu+.appearance[data-v-822684d1]:before,.menu+.social-links[data-v-822684d1]:before,.translations+.appearance[data-v-822684d1]:before,.appearance+.social-links[data-v-822684d1]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-822684d1]:before,.translations+.appearance[data-v-822684d1]:before{margin-right:16px}.appearance+.social-links[data-v-822684d1]:before{margin-left:16px}.social-links[data-v-822684d1]{margin-right:-8px}.divider[data-v-822684d1]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-822684d1]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-822684d1]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-822684d1]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-822684d1]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-822684d1]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-822684d1]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-ffb44008]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-ffb44008]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-735512b8]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-735512b8]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-372ae7c0]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-372ae7c0]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-4b8941ac]{display:block}.title[data-v-4b8941ac]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-875057a5]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-875057a5]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-875057a5]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-875057a5]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-875057a5]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-875057a5]{transform:rotate(45deg)}.button[data-v-875057a5]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-875057a5]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-875057a5]{transition:transform .25s}.group[data-v-875057a5]:first-child{padding-top:0}.group+.group[data-v-875057a5],.group+.item[data-v-875057a5]{padding-top:4px}.VPNavScreenTranslations[data-v-362991c2]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-362991c2]{height:auto}.title[data-v-362991c2]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-362991c2]{font-size:16px}.icon.lang[data-v-362991c2]{margin-right:8px}.icon.chevron[data-v-362991c2]{margin-left:4px}.list[data-v-362991c2]{padding:4px 0 0 24px}.link[data-v-362991c2]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-833aabba]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-833aabba],.VPNavScreen.fade-leave-active[data-v-833aabba]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-833aabba],.VPNavScreen.fade-leave-active .container[data-v-833aabba]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-833aabba],.VPNavScreen.fade-leave-to[data-v-833aabba]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-833aabba],.VPNavScreen.fade-leave-to .container[data-v-833aabba]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-833aabba]{display:none}}.container[data-v-833aabba]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-833aabba],.menu+.appearance[data-v-833aabba],.translations+.appearance[data-v-833aabba]{margin-top:24px}.menu+.social-links[data-v-833aabba]{margin-top:16px}.appearance+.social-links[data-v-833aabba]{margin-top:16px}.VPNav[data-v-f1e365da]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-f1e365da]{position:fixed}}.VPSidebarItem.level-0[data-v-196b2e5f]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-196b2e5f]{padding-bottom:10px}.item[data-v-196b2e5f]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-196b2e5f]{cursor:pointer}.indicator[data-v-196b2e5f]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-196b2e5f],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-196b2e5f]{background-color:var(--vp-c-brand-1)}.link[data-v-196b2e5f]{display:flex;align-items:center;flex-grow:1}.text[data-v-196b2e5f]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-196b2e5f]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-196b2e5f],.VPSidebarItem.level-2 .text[data-v-196b2e5f],.VPSidebarItem.level-3 .text[data-v-196b2e5f],.VPSidebarItem.level-4 .text[data-v-196b2e5f],.VPSidebarItem.level-5 .text[data-v-196b2e5f]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-196b2e5f],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-196b2e5f]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-1.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-2.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-3.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-4.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-5.has-active>.item>.text[data-v-196b2e5f],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-196b2e5f],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-196b2e5f]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-196b2e5f],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-196b2e5f]{color:var(--vp-c-brand-1)}.caret[data-v-196b2e5f]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-196b2e5f]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-196b2e5f]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-196b2e5f]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-196b2e5f]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-196b2e5f],.VPSidebarItem.level-2 .items[data-v-196b2e5f],.VPSidebarItem.level-3 .items[data-v-196b2e5f],.VPSidebarItem.level-4 .items[data-v-196b2e5f],.VPSidebarItem.level-5 .items[data-v-196b2e5f]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-196b2e5f]{display:none}.no-transition[data-v-9e426adc] .caret-icon{transition:none}.group+.group[data-v-9e426adc]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-9e426adc]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-18756405]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-18756405]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-18756405]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-18756405]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-18756405]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-18756405]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-18756405]{outline:0}.VPSkipLink[data-v-c3508ec8]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-c3508ec8]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-c3508ec8]{top:14px;left:16px}}.Layout[data-v-a9a9e638]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-db81191c]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-db81191c]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-db81191c]{margin:128px 0}}.VPHomeSponsors[data-v-db81191c]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-db81191c]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-db81191c]{padding:0 64px}}.container[data-v-db81191c]{margin:0 auto;max-width:1152px}.love[data-v-db81191c]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-db81191c]{display:inline-block}.message[data-v-db81191c]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-db81191c]{padding-top:32px}.action[data-v-db81191c]{padding-top:40px;text-align:center}.VPTeamPage[data-v-c2f8e101]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-c2f8e101]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-c2f8e101-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-c2f8e101-s],.VPTeamMembers+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-c2f8e101-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-c2f8e101-s],.VPTeamMembers+.VPTeamPageSection[data-v-c2f8e101-s]{margin-top:96px}}.VPTeamMembers[data-v-c2f8e101-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-c2f8e101-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-c2f8e101-s]{padding:0 64px}}.VPTeamPageTitle[data-v-e277e15c]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-e277e15c]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-e277e15c]{padding:80px 64px 48px}}.title[data-v-e277e15c]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-e277e15c]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-e277e15c]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-e277e15c]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-d43bc49d]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-d43bc49d]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-d43bc49d]{padding:0 64px}}.title[data-v-d43bc49d]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-d43bc49d]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-d43bc49d]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-d43bc49d]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-d43bc49d]{padding-top:40px}.VPTeamMembersItem[data-v-f9987cb6]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-f9987cb6]{padding:32px}.VPTeamMembersItem.small .data[data-v-f9987cb6]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-f9987cb6]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-f9987cb6]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-f9987cb6]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-f9987cb6]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-f9987cb6]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-f9987cb6]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-f9987cb6]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-f9987cb6]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-f9987cb6]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-f9987cb6]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-f9987cb6]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-f9987cb6]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-f9987cb6]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-f9987cb6]{text-align:center}.avatar[data-v-f9987cb6]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-f9987cb6]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-f9987cb6]{margin:0;font-weight:600}.affiliation[data-v-f9987cb6]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-f9987cb6]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-f9987cb6]:hover{color:var(--vp-c-brand-1)}.desc[data-v-f9987cb6]{margin:0 auto}.desc[data-v-f9987cb6] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-f9987cb6]{display:flex;justify-content:center;height:56px}.sp-link[data-v-f9987cb6]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-f9987cb6]:hover,.sp .sp-link.link[data-v-f9987cb6]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-f9987cb6]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-fba19bad]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-fba19bad]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-fba19bad]{max-width:876px}.VPTeamMembers.medium .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-fba19bad]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-fba19bad]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-fba19bad]{max-width:760px}.container[data-v-fba19bad]{display:grid;gap:24px;margin:0 auto;max-width:1152px}:root{--vp-plugin-tabs-tab-text-color: var(--vp-c-text-2);--vp-plugin-tabs-tab-active-text-color: var(--vp-c-text-1);--vp-plugin-tabs-tab-hover-text-color: var(--vp-c-text-1);--vp-plugin-tabs-tab-bg: var(--vp-c-bg-soft);--vp-plugin-tabs-tab-divider: var(--vp-c-divider);--vp-plugin-tabs-tab-active-bar-color: var(--vp-c-brand-1)}.plugin-tabs{margin:16px 0;background-color:var(--vp-plugin-tabs-tab-bg);border-radius:8px}.plugin-tabs--tab-list{position:relative;padding:0 12px;overflow-x:auto;overflow-y:hidden}.plugin-tabs--tab-list:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background-color:var(--vp-plugin-tabs-tab-divider)}.plugin-tabs--tab{position:relative;padding:0 12px;line-height:48px;border-bottom:2px solid transparent;color:var(--vp-plugin-tabs-tab-text-color);font-size:14px;font-weight:500;white-space:nowrap;transition:color .25s}.plugin-tabs--tab[aria-selected=true]{color:var(--vp-plugin-tabs-tab-active-text-color)}.plugin-tabs--tab:hover{color:var(--vp-plugin-tabs-tab-hover-text-color)}.plugin-tabs--tab:after{content:"";position:absolute;bottom:-2px;left:8px;right:8px;height:2px;background-color:transparent;transition:background-color .25s;z-index:1}.plugin-tabs--tab[aria-selected=true]:after{background-color:var(--vp-plugin-tabs-tab-active-bar-color)}.plugin-tabs--content[data-v-9b0d03d2]{padding:16px}.plugin-tabs--content[data-v-9b0d03d2]>:first-child:first-child{margin-top:0}.plugin-tabs--content[data-v-9b0d03d2]>:last-child:last-child{margin-bottom:0}.plugin-tabs--content[data-v-9b0d03d2]>div[class*=language-]{border-radius:8px;margin:16px 0}:root:not(.dark) .plugin-tabs--content[data-v-9b0d03d2] div[class*=language-]{background-color:var(--vp-c-bg)}.VPHero .clip{white-space:pre;max-width:500px}@font-face{font-family:JuliaMono-Regular;src:url(https://cdn.jsdelivr.net/gh/cormullion/juliamono/webfonts/JuliaMono-Regular.woff2)}:root{--vp-font-family-base: "Barlow", "Inter var experimental", "Inter var", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--vp-font-family-mono: JuliaMono-Regular, monospace}.mono-no-substitutions{font-family:JuliaMono-Regular,monospace;font-feature-settings:"calt" off}.mono-no-substitutions-alt{font-family:JuliaMono-Regular,monospace;font-variant-ligatures:none}pre,code{font-family:JuliaMono-Regular,monospace;font-feature-settings:"calt" off}:root{--julia-blue: #4063D8;--julia-purple: #9558B2;--julia-red: #CB3C33;--julia-green: #389826;--vp-c-brand: #389826;--vp-c-brand-light: #3dd027;--vp-c-brand-lighter: #9499ff;--vp-c-brand-lightest: #bcc0ff;--vp-c-brand-dark: #535bf2;--vp-c-brand-darker: #454ce1;--vp-c-brand-dimm: #212425}:root{--vp-button-brand-border: var(--vp-c-brand-light);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand);--vp-button-brand-hover-border: var(--vp-c-brand-light);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-light);--vp-button-brand-active-border: var(--vp-c-brand-light);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-button-brand-bg)}:root{--vp-home-hero-name-color: transparent;--vp-home-hero-name-background: -webkit-linear-gradient( 120deg, #9558B2 30%, #CB3C33 );--vp-home-hero-image-background-image: linear-gradient( -45deg, #9558B2 30%, #389826 30%, #CB3C33 );--vp-home-hero-image-filter: blur(40px)}@media (min-width: 640px){:root{--vp-home-hero-image-filter: blur(56px)}}@media (min-width: 960px){:root{--vp-home-hero-image-filter: blur(72px)}}:root.dark{--vp-custom-block-tip-border: var(--vp-c-brand);--vp-custom-block-tip-text: var(--vp-c-brand-lightest);--vp-custom-block-tip-bg: var(--vp-c-brand-dimm);--vp-c-black: hsl(220 20% 9%);--vp-c-black-pure: hsl(220, 24%, 4%);--vp-c-black-soft: hsl(220 16% 13%);--vp-c-black-mute: hsl(220 14% 17%);--vp-c-gray: hsl(220 8% 56%);--vp-c-gray-dark-1: hsl(220 10% 39%);--vp-c-gray-dark-2: hsl(220 12% 28%);--vp-c-gray-dark-3: hsl(220 12% 23%);--vp-c-gray-dark-4: hsl(220 14% 17%);--vp-c-gray-dark-5: hsl(220 16% 13%);--vp-custom-block-info-bg: hsl(220 14% 17%)}.DocSearch{--docsearch-primary-color: var(--vp-c-brand) !important}mjx-container>svg{display:block;margin:auto}mjx-container{padding:.5rem 0}mjx-container{display:inline;margin:auto 2px -2px}mjx-container>svg{margin:auto;display:inline-block}:root{--vp-c-brand-1: #CB3C33;--vp-c-brand-2: #CB3C33;--vp-c-brand-3: #CB3C33;--vp-c-sponsor: #ca2971;--vitest-c-sponsor-hover: #c13071}.dark{--vp-c-brand-1: #91dd33;--vp-c-brand-2: #91dd33;--vp-c-brand-3: #91dd33;--vp-c-sponsor: #91dd33;--vitest-c-sponsor-hover: #e51370}:root:not(.dark) .dark-only{display:none}:root:is(.dark) .light-only{display:none}.VPDoc.has-aside .content-container{max-width:100%!important}.aside{max-width:200px!important;padding-left:0!important}.VPDoc{padding-top:15px!important;padding-left:5px!important}.VPDocOutlineItem li{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:200px}.VPNavBar .title{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}@media (max-width: 960px){.VPDoc{padding-left:25px!important}}.jldocstring.custom-block{border:1px solid var(--vp-c-gray-2);color:var(--vp-c-text-1)}.jldocstring.custom-block summary{font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none;margin:0 0 8px}.VPLocalSearchBox[data-v-42e65fb9]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-42e65fb9]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-42e65fb9]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-42e65fb9]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-42e65fb9]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-42e65fb9]{padding:0 8px}}.search-bar[data-v-42e65fb9]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-42e65fb9]{display:block;font-size:18px}.navigate-icon[data-v-42e65fb9]{display:block;font-size:14px}.search-icon[data-v-42e65fb9]{margin:8px}@media (max-width: 767px){.search-icon[data-v-42e65fb9]{display:none}}.search-input[data-v-42e65fb9]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-42e65fb9]{padding:6px 4px}}.search-actions[data-v-42e65fb9]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-42e65fb9]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-42e65fb9]{display:none}}.search-actions button[data-v-42e65fb9]{padding:8px}.search-actions button[data-v-42e65fb9]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-42e65fb9]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-42e65fb9]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-42e65fb9]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-42e65fb9]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-42e65fb9]{display:none}}.search-keyboard-shortcuts kbd[data-v-42e65fb9]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-42e65fb9]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-42e65fb9]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-42e65fb9]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-42e65fb9]{margin:8px}}.titles[data-v-42e65fb9]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-42e65fb9]{display:flex;align-items:center;gap:4px}.title.main[data-v-42e65fb9]{font-weight:500}.title-icon[data-v-42e65fb9]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-42e65fb9]{opacity:.5}.result.selected[data-v-42e65fb9]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-42e65fb9]{position:relative}.excerpt[data-v-42e65fb9]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-42e65fb9]{opacity:1}.excerpt[data-v-42e65fb9] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-42e65fb9] mark,.excerpt[data-v-42e65fb9] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-42e65fb9] .vp-code-group .tabs{display:none}.excerpt[data-v-42e65fb9] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-42e65fb9]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-42e65fb9]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-42e65fb9],.result.selected .title-icon[data-v-42e65fb9]{color:var(--vp-c-brand-1)!important}.no-results[data-v-42e65fb9]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-42e65fb9]{flex:none}
diff --git a/previews/PR126/assets/xsmunma.C3CW_rGA.png b/previews/PR126/assets/xsmunma.C3CW_rGA.png
new file mode 100644
index 00000000..a3329bab
Binary files /dev/null and b/previews/PR126/assets/xsmunma.C3CW_rGA.png differ
diff --git a/previews/PR126/assets/ylwwdlu.DcGjID-r.png b/previews/PR126/assets/ylwwdlu.DcGjID-r.png
new file mode 100644
index 00000000..10d9c201
Binary files /dev/null and b/previews/PR126/assets/ylwwdlu.DcGjID-r.png differ
diff --git a/previews/PR126/assets/ziapkjz.D0gpz0HH.png b/previews/PR126/assets/ziapkjz.D0gpz0HH.png
new file mode 100644
index 00000000..72e8d99c
Binary files /dev/null and b/previews/PR126/assets/ziapkjz.D0gpz0HH.png differ
diff --git a/previews/PR126/examples/generated/Actuator2D.html b/previews/PR126/examples/generated/Actuator2D.html
new file mode 100644
index 00000000..53e26d46
--- /dev/null
+++ b/previews/PR126/examples/generated/Actuator2D.html
@@ -0,0 +1,160 @@
+
+
+
+
+
+ Unsteady actuator case - 2D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/Actuator3D.html b/previews/PR126/examples/generated/Actuator3D.html
new file mode 100644
index 00000000..10fe53d1
--- /dev/null
+++ b/previews/PR126/examples/generated/Actuator3D.html
@@ -0,0 +1,145 @@
+
+
+
+
+
+ Unsteady actuator case - 3D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/BackwardFacingStep2D.html b/previews/PR126/examples/generated/BackwardFacingStep2D.html
new file mode 100644
index 00000000..2c2fd6ab
--- /dev/null
+++ b/previews/PR126/examples/generated/BackwardFacingStep2D.html
@@ -0,0 +1,125 @@
+
+
+
+
+
+ Backward Facing Step - 2D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/BackwardFacingStep3D.html b/previews/PR126/examples/generated/BackwardFacingStep3D.html
new file mode 100644
index 00000000..f8db69b7
--- /dev/null
+++ b/previews/PR126/examples/generated/BackwardFacingStep3D.html
@@ -0,0 +1,128 @@
+
+
+
+
+
+ Backward Facing Step - 3D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/DecayingTurbulence2D.html b/previews/PR126/examples/generated/DecayingTurbulence2D.html
new file mode 100644
index 00000000..336aadbc
--- /dev/null
+++ b/previews/PR126/examples/generated/DecayingTurbulence2D.html
@@ -0,0 +1,95 @@
+
+
+
+
+
+ Decaying Homogeneous Isotropic Turbulence - 2D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/DecayingTurbulence3D.html b/previews/PR126/examples/generated/DecayingTurbulence3D.html
new file mode 100644
index 00000000..a821d763
--- /dev/null
+++ b/previews/PR126/examples/generated/DecayingTurbulence3D.html
@@ -0,0 +1,86 @@
+
+
+
+
+
+ Decaying Homogeneous Isotropic Turbulence - 3D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/Kolmogorov2D.html b/previews/PR126/examples/generated/Kolmogorov2D.html
new file mode 100644
index 00000000..ad202b85
--- /dev/null
+++ b/previews/PR126/examples/generated/Kolmogorov2D.html
@@ -0,0 +1,104 @@
+
+
+
+
+
+ Kolmogorov flow (2D) | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/LidDrivenCavity2D.html b/previews/PR126/examples/generated/LidDrivenCavity2D.html
new file mode 100644
index 00000000..edb15002
--- /dev/null
+++ b/previews/PR126/examples/generated/LidDrivenCavity2D.html
@@ -0,0 +1,120 @@
+
+
+
+
+
+ Tutorial: Lid-Driven Cavity - 2D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/LidDrivenCavity3D.html b/previews/PR126/examples/generated/LidDrivenCavity3D.html
new file mode 100644
index 00000000..46f72973
--- /dev/null
+++ b/previews/PR126/examples/generated/LidDrivenCavity3D.html
@@ -0,0 +1,108 @@
+
+
+
+
+
+ Lid-Driven Cavity - 3D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/MultiActuator.html b/previews/PR126/examples/generated/MultiActuator.html
new file mode 100644
index 00000000..d18f9ed9
--- /dev/null
+++ b/previews/PR126/examples/generated/MultiActuator.html
@@ -0,0 +1,222 @@
+
+
+
+
+
+ Unsteady actuator case - 2D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/PlanarMixing2D.html b/previews/PR126/examples/generated/PlanarMixing2D.html
new file mode 100644
index 00000000..4a3f6c21
--- /dev/null
+++ b/previews/PR126/examples/generated/PlanarMixing2D.html
@@ -0,0 +1,135 @@
+
+
+
+
+
+ Planar mixing - 2D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/PlaneJets2D.html b/previews/PR126/examples/generated/PlaneJets2D.html
new file mode 100644
index 00000000..11c8fa9d
--- /dev/null
+++ b/previews/PR126/examples/generated/PlaneJets2D.html
@@ -0,0 +1,302 @@
+
+
+
+
+
+ Plane jets - 2D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/RayleighBenard2D.html b/previews/PR126/examples/generated/RayleighBenard2D.html
new file mode 100644
index 00000000..3befa1b5
--- /dev/null
+++ b/previews/PR126/examples/generated/RayleighBenard2D.html
@@ -0,0 +1,251 @@
+
+
+
+
+
+ Rayleigh-Bénard convection (2D) | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/RayleighBenard3D.html b/previews/PR126/examples/generated/RayleighBenard3D.html
new file mode 100644
index 00000000..89e3067a
--- /dev/null
+++ b/previews/PR126/examples/generated/RayleighBenard3D.html
@@ -0,0 +1,203 @@
+
+
+
+
+
+ Rayleigh-Bénard convection (3D) | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/RayleighTaylor2D.html b/previews/PR126/examples/generated/RayleighTaylor2D.html
new file mode 100644
index 00000000..4a006e72
--- /dev/null
+++ b/previews/PR126/examples/generated/RayleighTaylor2D.html
@@ -0,0 +1,125 @@
+
+
+
+
+
+ Rayleigh-Taylor instability in 2D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/RayleighTaylor3D.html b/previews/PR126/examples/generated/RayleighTaylor3D.html
new file mode 100644
index 00000000..19754318
--- /dev/null
+++ b/previews/PR126/examples/generated/RayleighTaylor3D.html
@@ -0,0 +1,190 @@
+
+
+
+
+
+ Rayleigh-Taylor instability in 2D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/ShearLayer2D.html b/previews/PR126/examples/generated/ShearLayer2D.html
new file mode 100644
index 00000000..11ece931
--- /dev/null
+++ b/previews/PR126/examples/generated/ShearLayer2D.html
@@ -0,0 +1,113 @@
+
+
+
+
+
+ Shear layer - 2D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/TaylorGreenVortex2D.html b/previews/PR126/examples/generated/TaylorGreenVortex2D.html
new file mode 100644
index 00000000..a08ad79a
--- /dev/null
+++ b/previews/PR126/examples/generated/TaylorGreenVortex2D.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+ Convergence study: Taylor-Green vortex (2D) | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/generated/TaylorGreenVortex3D.html b/previews/PR126/examples/generated/TaylorGreenVortex3D.html
new file mode 100644
index 00000000..2eaed1c7
--- /dev/null
+++ b/previews/PR126/examples/generated/TaylorGreenVortex3D.html
@@ -0,0 +1,111 @@
+
+
+
+
+
+ Taylor-Green vortex - 3D | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/examples/index.html b/previews/PR126/examples/index.html
new file mode 100644
index 00000000..6ef01355
--- /dev/null
+++ b/previews/PR126/examples/index.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+ Examples gallery | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/favicon-16x16.png b/previews/PR126/favicon-16x16.png
new file mode 100644
index 00000000..cfc67885
Binary files /dev/null and b/previews/PR126/favicon-16x16.png differ
diff --git a/previews/PR126/favicon-32x32.png b/previews/PR126/favicon-32x32.png
new file mode 100644
index 00000000..c67b0beb
Binary files /dev/null and b/previews/PR126/favicon-32x32.png differ
diff --git a/previews/PR126/favicon.ico b/previews/PR126/favicon.ico
new file mode 100644
index 00000000..f8849c5d
Binary files /dev/null and b/previews/PR126/favicon.ico differ
diff --git a/previews/PR126/getting_started.html b/previews/PR126/getting_started.html
new file mode 100644
index 00000000..fe73892a
--- /dev/null
+++ b/previews/PR126/getting_started.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+ Getting Started | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Skip to content Getting Started To install IncompressibleNavierStokes, open up a Julia-REPL, type ]
to get into Pkg-mode, and type:
sh add IncompressibleNavierStokes
which will install the package and all dependencies to your local environment. Note that IncompressibleNavierStokes requires Julia version 1.9
or above.
Check out the gallery for commented example simulations.
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/grid.png b/previews/PR126/grid.png
new file mode 100644
index 00000000..a40dbc86
Binary files /dev/null and b/previews/PR126/grid.png differ
diff --git a/previews/PR126/hashmap.json b/previews/PR126/hashmap.json
new file mode 100644
index 00000000..14332b0b
--- /dev/null
+++ b/previews/PR126/hashmap.json
@@ -0,0 +1 @@
+{"about_citing.md":"Dcb0a_6u","about_contributing.md":"BzPOAokx","about_development.md":"DV7wzfz4","about_index.md":"B4nRb4pd","about_license.md":"qHmUISQY","about_versions.md":"spYcSs0d","examples_generated_actuator2d.md":"CjJk3Yks","examples_generated_actuator3d.md":"DDNf_NQa","examples_generated_backwardfacingstep2d.md":"B1L_JUM9","examples_generated_backwardfacingstep3d.md":"BQ3_PVJu","examples_generated_decayingturbulence2d.md":"WF0Cn1Zb","examples_generated_decayingturbulence3d.md":"CPesWMyv","examples_generated_kolmogorov2d.md":"C7XWVq5k","examples_generated_liddrivencavity2d.md":"D_iNsMnv","examples_generated_liddrivencavity3d.md":"CXnvIfHv","examples_generated_multiactuator.md":"DeF4XHSW","examples_generated_planarmixing2d.md":"DlU0y6-e","examples_generated_planejets2d.md":"Cxpw6Mt8","examples_generated_rayleighbenard2d.md":"DlQrJFaM","examples_generated_rayleighbenard3d.md":"BFDE04bU","examples_generated_rayleightaylor2d.md":"BS44XuaT","examples_generated_rayleightaylor3d.md":"DNAhoUfj","examples_generated_shearlayer2d.md":"DGqD8BRv","examples_generated_taylorgreenvortex2d.md":"ByImGK6X","examples_generated_taylorgreenvortex3d.md":"CgnLg1YH","examples_index.md":"Bv0KGHOS","getting_started.md":"CNlPkqwq","index.md":"DfziRIh_","manual_closure.md":"DJlmWyys","manual_differentiability.md":"Do-3poq7","manual_gpu.md":"DpR1QCQ8","manual_les.md":"C92GZ80j","manual_matrices.md":"CJA9PRBT","manual_ns.md":"Bdh0AlV6","manual_operators.md":"CrXXLMhT","manual_precision.md":"B1snHDv2","manual_pressure.md":"Bb8fJUK2","manual_sciml.md":"CogLuKgu","manual_setup.md":"BQcEIomz","manual_solver.md":"DxVH47Jn","manual_spatial.md":"Cj3WsAzX","manual_temperature.md":"Bxtw-FWq","manual_time.md":"DY8-Hmku","manual_utils.md":"CN3AVUha","references.md":"BG5rX2tb"}
diff --git a/previews/PR126/index.html b/previews/PR126/index.html
new file mode 100644
index 00000000..ed778cec
--- /dev/null
+++ b/previews/PR126/index.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+ IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Skip to content Navier-Stokes Experience 21st century turbulence
Differentiable fluid solver written in Julia
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/logo.png b/previews/PR126/logo.png
new file mode 100644
index 00000000..ae7cd17f
Binary files /dev/null and b/previews/PR126/logo.png differ
diff --git a/previews/PR126/logo.svg b/previews/PR126/logo.svg
new file mode 100644
index 00000000..d21e1c0d
--- /dev/null
+++ b/previews/PR126/logo.svg
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/previews/PR126/logo_text.svg b/previews/PR126/logo_text.svg
new file mode 100644
index 00000000..2e894467
--- /dev/null
+++ b/previews/PR126/logo_text.svg
@@ -0,0 +1,210 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ N av i e r S t o k e s . j l
+ I n c o m p r e ss i b l e
+
+
+
diff --git a/previews/PR126/logo_text_dots.png b/previews/PR126/logo_text_dots.png
new file mode 100644
index 00000000..005701f5
Binary files /dev/null and b/previews/PR126/logo_text_dots.png differ
diff --git a/previews/PR126/logo_text_dots.svg b/previews/PR126/logo_text_dots.svg
new file mode 100644
index 00000000..6c73db25
--- /dev/null
+++ b/previews/PR126/logo_text_dots.svg
@@ -0,0 +1,252 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/previews/PR126/logo_text_dots_dark_mode.png b/previews/PR126/logo_text_dots_dark_mode.png
new file mode 100644
index 00000000..f7ad36ed
Binary files /dev/null and b/previews/PR126/logo_text_dots_dark_mode.png differ
diff --git a/previews/PR126/manual/closure.html b/previews/PR126/manual/closure.html
new file mode 100644
index 00000000..52a994b2
--- /dev/null
+++ b/previews/PR126/manual/closure.html
@@ -0,0 +1,141 @@
+
+
+
+
+
+ Neural closure models | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/differentiability.html b/previews/PR126/manual/differentiability.html
new file mode 100644
index 00000000..8096daee
--- /dev/null
+++ b/previews/PR126/manual/differentiability.html
@@ -0,0 +1,122 @@
+
+
+
+
+
+ Differentiating through the code | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/gpu.html b/previews/PR126/manual/gpu.html
new file mode 100644
index 00000000..6f96f241
--- /dev/null
+++ b/previews/PR126/manual/gpu.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+ GPU Support | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/les.html b/previews/PR126/manual/les.html
new file mode 100644
index 00000000..a2bc586f
--- /dev/null
+++ b/previews/PR126/manual/les.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+ Large eddy simulation | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/matrices.html b/previews/PR126/manual/matrices.html
new file mode 100644
index 00000000..af3c2ae4
--- /dev/null
+++ b/previews/PR126/manual/matrices.html
@@ -0,0 +1,148 @@
+
+
+
+
+
+ Sparse matrices | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/ns.html b/previews/PR126/manual/ns.html
new file mode 100644
index 00000000..3b757aa1
--- /dev/null
+++ b/previews/PR126/manual/ns.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+ Incompressible Navier-Stokes equations | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/operators.html b/previews/PR126/manual/operators.html
new file mode 100644
index 00000000..ec65520c
--- /dev/null
+++ b/previews/PR126/manual/operators.html
@@ -0,0 +1,35 @@
+
+
+
+
+
+ Operators | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/precision.html b/previews/PR126/manual/precision.html
new file mode 100644
index 00000000..dcb07be1
--- /dev/null
+++ b/previews/PR126/manual/precision.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+ Floating point precision | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/pressure.html b/previews/PR126/manual/pressure.html
new file mode 100644
index 00000000..9e03eee3
--- /dev/null
+++ b/previews/PR126/manual/pressure.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+ Pressure solvers | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/sciml.html b/previews/PR126/manual/sciml.html
new file mode 100644
index 00000000..b2ea6064
--- /dev/null
+++ b/previews/PR126/manual/sciml.html
@@ -0,0 +1,90 @@
+
+
+
+
+
+ Using IncompressibleNavierStokes in SciML | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/setup.html b/previews/PR126/manual/setup.html
new file mode 100644
index 00000000..43816223
--- /dev/null
+++ b/previews/PR126/manual/setup.html
@@ -0,0 +1,60 @@
+
+
+
+
+
+ Problem setup | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/solver.html b/previews/PR126/manual/solver.html
new file mode 100644
index 00000000..7edace5a
--- /dev/null
+++ b/previews/PR126/manual/solver.html
@@ -0,0 +1,80 @@
+
+
+
+
+
+ Solvers | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/spatial.html b/previews/PR126/manual/spatial.html
new file mode 100644
index 00000000..ea5fa960
--- /dev/null
+++ b/previews/PR126/manual/spatial.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+ Spatial discretization | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/temperature.html b/previews/PR126/manual/temperature.html
new file mode 100644
index 00000000..7464285f
--- /dev/null
+++ b/previews/PR126/manual/temperature.html
@@ -0,0 +1,42 @@
+
+
+
+
+
+ Temperature equation | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/time.html b/previews/PR126/manual/time.html
new file mode 100644
index 00000000..07f7c9ae
--- /dev/null
+++ b/previews/PR126/manual/time.html
@@ -0,0 +1,203 @@
+
+
+
+
+
+ Time discretization | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/manual/utils.html b/previews/PR126/manual/utils.html
new file mode 100644
index 00000000..1c78a249
--- /dev/null
+++ b/previews/PR126/manual/utils.html
@@ -0,0 +1,40 @@
+
+
+
+
+
+ Utils | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/references.html b/previews/PR126/references.html
new file mode 100644
index 00000000..879bd41a
--- /dev/null
+++ b/previews/PR126/references.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+ References | IncompressibleNavierStokes.jl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Skip to content References Bibliography D. Kochkov, J. A. Smith, A. Alieva, Q. Wang, M. P. Brenner and S. Hoyer. Machine learning-accelerated computational fluid dynamics . Proceedings of the National Academy of Sciences 118 (2021).
M. Kurz, P. Offenhäuser and A. Beck. Deep Reinforcement Learning for Turbulence Modeling in Large Eddy Simulations , arXiv (2022).
B. List, L.-W. Chen and N. Thuerey. Learned Turbulence Modelling with Differentiable Fluid Solvers , arxiv:2202.06988 (2022).
J. F. MacArt, J. Sirignano and J. B. Freund. Embedded training of neural-network sub-grid-scale turbulence models (2021 ).
J. Li and P. M. Carrica. A simple approach for vortex core visualization , arXiv:1910.06998 (2019), arXiv:1910.06998 [physics.flu-dyn] .
J. Jeong and F. Hussain. On the identification of a vortex . J. Fluid. Mech. 285 , 69–94 (1995).
S. B. Pope. Turbulent Flows (Cambridge University Press, Cambridge, England, 2000).
B. Sanderse and F. X. Trias. Energy-consistent discretization of viscous dissipation with application to natural convection flow (Jul 2023), arXiv:2307.10874v1 [physics.flu-dyn] .
M. H. Silvis, R. A. Remmerswaal and R. Verstappen. Physical consistency of subgrid-scale models for large-eddy simulation of incompressible turbulent flows . Physics of Fluids 29 (2017).
F. X. TRIAS, M. SORIA, A. OLIVA and C. D. PÉREZ-SEGARRA. Direct numerical simulations of two- and three-dimensional turbulent natural convection flows in a differentially heated cavity of aspect ratio 4 . Journal of Fluid Mechanics 586 , 259–293 (2007).
P. Orlandi. Fluid flow phenomena: a numerical toolkit . Vol. 55 (Springer Science & Business Media, 2000).
O. San and A. E. Staples. High-order methods for decaying two-dimensional homogeneous isotropic turbulence . Computers & Fluids 63 , 105–127 (2012).
F. H. Harlow and J. E. Welch. * Numerical Calculation of Time‐Dependent Viscous Incompressible Flow of Fluid with Free Surface * . The Physics of Fluids 8 , 2182–2189 (1965), arXiv:https://aip.scitation.org/doi/pdf/10.1063/1.1761178 .
R. W. Verstappen and A. E. Veldman. Symmetry-Preserving Discretization of Turbulent Flow . J. Comput. Phys. 187 , 343–368 (2003).
B. Sanderse, R. Verstappen and B. Koren. Boundary treatment for fourth-order staggered mesh discretizations of the incompressible Navier–Stokes equations . Journal of Computational Physics 257 , 1472–1505 (2014). Physics-compatible numerical methods.
R. Verstappen and A. Veldman. Direct Numerical Simulation of Turbulence at Lower Costs . Journal of Engineering Mathematics 32 , 143–159 (1997).
B. Sanderse and B. Koren. Accuracy analysis of explicit Runge–Kutta methods applied to the incompressible Navier–Stokes equations . Journal of Computational Physics 231 , 3041–3063 (2012).
B. Sanderse. Energy-conserving Runge–Kutta methods for the incompressible Navier–Stokes equations . Journal of Computational Physics 233 , 100–131 (2013).
+
+
+
+
\ No newline at end of file
diff --git a/previews/PR126/resolution.png b/previews/PR126/resolution.png
new file mode 100644
index 00000000..af544cc4
Binary files /dev/null and b/previews/PR126/resolution.png differ
diff --git a/previews/PR126/resolution.svg b/previews/PR126/resolution.svg
new file mode 100644
index 00000000..b5e228e7
--- /dev/null
+++ b/previews/PR126/resolution.svg
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/previews/PR126/siteinfo.js b/previews/PR126/siteinfo.js
new file mode 100644
index 00000000..53d36efb
--- /dev/null
+++ b/previews/PR126/siteinfo.js
@@ -0,0 +1 @@
+var DOCUMENTER_CURRENT_VERSION = "previews/PR126";
diff --git a/previews/PR126/vp-icons.css b/previews/PR126/vp-icons.css
new file mode 100644
index 00000000..ddc5bd8e
--- /dev/null
+++ b/previews/PR126/vp-icons.css
@@ -0,0 +1 @@
+.vpi-social-github{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")}
\ No newline at end of file