Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
4450bed
Adding interpol.jl, hyperbolic1D.jl and edit on Operators.jl
jlbaranda Apr 22, 2026
5fd73e6
Completed hyperbolic1D and work in progress on burgers1D
jlbaranda May 3, 2026
004906f
modified changes on interpol.jl
jlbaranda May 3, 2026
4812961
removed comments print tstatements from burgers1D.jl
jlbaranda May 3, 2026
01f115b
Added tests for interpol operator
jlbaranda May 3, 2026
76d4407
adding interpol test
jlbaranda May 3, 2026
102275d
Created function method for burgers, and added png and animation
jlbaranda May 19, 2026
d639c66
png and gif of Burgers1D
jlbaranda May 19, 2026
e8b0c82
Moved files to a new folder
jlbaranda May 19, 2026
0a05951
Updated hyperbolic1D.jl file
jlbaranda May 29, 2026
469afa0
outputs of hyperbolic1D.jl
jlbaranda May 29, 2026
d97784b
Hyperbolic Problems index.md
jlbaranda May 30, 2026
b6d0a8e
Documentation of 1D Hyperbolic problems Hyperbolic1D.md, Burgers1D.md…
jlbaranda May 30, 2026
d096d5d
Modified index.md in examples file to include hyperbolic problems
jlbaranda May 30, 2026
b345f3a
Added Hyperbolic Problems to src/index.md to include Burgers1D and Hy…
jlbaranda May 31, 2026
da39253
Modified index.md to include interpol operator
jlbaranda Jun 3, 2026
f9514bc
Removed output foler
jlbaranda Jun 3, 2026
267c13f
Changed how documenation of interpol.jl is written to work on docs file
jlbaranda Jun 4, 2026
ef4ea73
removed comment of tests that were used to test how I would create fo…
jlbaranda Jun 7, 2026
40b3112
Merge branch 'main' into interpolator_branch2
jlbaranda Jun 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions julia/MOLE.jl/docs/src/examples/Hyperbolic/1D/Burgers1D.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Burgers 1D

Solves the conservative form of the inviscid Burger's Equation in 1D.

```math
\frac{\partial }{\partial t} U + \frac{\partial}{\partial x} \left(\frac{U^{2}}{2}\right)=0
```

with $U = u(x,t)$ defined on the domain $x \in [-15,15]$, from time $t \in [0,10]$ and initial condition

```math
u(x, 0) = e^{\frac{-x^{2}}{50}}
```

The wave is allowed to propagate across the domain while the area under the curve is calculated.


---
This example is implemented in [`burgers1D.jl`](https://github.com/csrc-sdsu/mole/blob/main/julia/MOLE/jl/examples/hyperbolic/burgers1D.jl)
36 changes: 36 additions & 0 deletions julia/MOLE.jl/docs/src/examples/Hyperbolic/1D/Hyperbolic1D.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Hyperbolic 1D

Solves the 1D advection equation with periodic boundary conditions.

```math
\frac{\partial }{\partial t} U + a \frac{\partial }{\partial x} U = 0
```

where $U = u(x,t)$ and $a = 1$ is the advection velocity. The domain $x \in [0,1]$ and $t \in [0,1]$ with initial condition

```math
u(x, 0) = \sin(2\pi x)
```

Periodic boundary conditions are used

```math
u(0, t) = u(1, t)
```

Using finite differences for the time derivative

```math
\frac{\partial U}{\partial t} = \frac{U^{n+1}_{i}-U^{n}_{i}}{\delta t}
```

where $U_{i}^{n}$ is $u(x_{i},t_{n})$ and the mimetic operator $\mathbf{D}$ for the space derivative.

```math
\frac{U^{n+1}_{i}-U^{n}_{i}}{\delta t} + a \mathbf{D}U_{i}^{n} = 0\\
\frac{U^{n+1}_{i}-U^{n}_{i}}{\delta t} = - a \mathbf{D}U_{i}^{n}\\
U^{n+1}_{i} = U^{n}_{i} - a \delta t \mathbf{D} U_{i}^{n}\\
```

---
This example is implemented in [`hyperbolic1D.jl`](https://github.com/csrc-sdsu/mole/blob/main/julia/MOLE.jl/examples/hyperbolic/hyperbolic1D.jl)
10 changes: 10 additions & 0 deletions julia/MOLE.jl/docs/src/examples/Hyperbolic/1D/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# 1D Hyperbolic Problems

These examples demonstrate the solution of hyperbolic equations in one dimension.

```@contents
:maxdepth: 1

Hyperbolic1D
Burgers1D
```
11 changes: 11 additions & 0 deletions julia/MOLE.jl/docs/src/examples/Hyperbolic/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Hyperbolic Problems

Hyperbolic partial differential equations model wave propagation and transport phenomena where information travels along characteristic curves. Examples include the wave equation, transport equation, and conservation laws such as Burgers' equation.

```@content
:maxdepth: 2
:caption: Contents

1D/index
```

1 change: 1 addition & 0 deletions julia/MOLE.jl/docs/src/examples/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ The name for OCTAVE/MATLAB, C++, and Julia will be the same (i.e., the files `el

src/examples/Elliptic/index
src/examples/Parabolic/index
src/examples/Hyperbolic/index
```

More examples will be added in the future.
5 changes: 5 additions & 0 deletions julia/MOLE.jl/docs/src/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ MOLE.Operators.grad(k::Int, m::Int, dx, n::Int, dy; dc::NTuple{4,T}, nc::NTuple{
MOLE.Operators.grad(k::Int, xticks::AbstractVector, yticks::AbstractVector)
MOLE.Operators.lap(k::Int, m::Int, dx; dc::NTuple{2,T}, nc::NTuple{2,T})
MOLE.Operators.lap(k::Int, m::Int, dx, n::Int, dy; dc::NTuple{4,T}, nc::NTuple{4,T})
MOLE.Operators.interpol(m::Int, c::Float64)
```

### Utilities
Expand Down Expand Up @@ -132,6 +133,10 @@ Currently, the following examples are available in the MOLE Julia package.
- 2D Examples
- ```elliptic2DXDirichletYDirichlet```: A script that solves the 2D Laplace equation, $\nabla^2 u = 0$, with Dirichlet boundary conditions in $x$ and $y$ using mimetic operators.
- ```elliptic2DXPerYDirichlet```: A script that solves the 2D Laplace equation, $\nabla^2 u = 0$, with periodic bonudary conditions in $x$ and Dirichlet boundary conditions in $y$ using mimetic operators.
- Hyperbolic Problems
Comment thread
jlbaranda marked this conversation as resolved.
- 1D Examples
- ```burgers1D```: A script that solves the 1D conservative form of inviscid Burgers equation using mimetic operators.
- ```hyperbolic1D```: A script that solves the 1D Hyperbolic Equation with Periodic boundary conditions using mimetic operators.
- Parabolic Problems
- 2D Examples
- ```parabolic2D```: A script that solves the 2D heat equation, $u_t = \nu \nabla^2 u$, with Dirichlet boundary conditions in $x$ and $y$ using mimetic operators.
106 changes: 106 additions & 0 deletions julia/MOLE.jl/examples/hyperbolic/burgers1D.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
#=
Solve the 1D Inviscid Burgers' equation
Upwind Scheme is used and the equation is written in conservative form.
Initial condition: exp(-x^2/50)
=#

using Plots
import MOLE: Operators, BCs


function upwind_burgers(u0, xgrid, T, k, m, dx)
#Solves Burgers equation using MOLE Operators
#=
INPUTS:
u0 : Initial condition
xgrid : staggered grid
T : final time
k : Operator order of accuarcy
m : number of cells
OUTPUTS:
U : solution
t : time interval
=#
#CFL Condition for explicit schemes
dt = dx;

#Create stepsize for time with given T
t = collect(0.0:dt:T)

#Use of MOLE Operators
D = Operators.div(k, m, dx)
I = Operators.interpol(m, 1.0)

#Premultiply out of time loop (does not change)
D = -dt/2*D*I

#Create an array that holds solution at each time step
U = zeros(length(t)+1,length(xgrid))

#Set initial condition at first time element
U[1,:] .= u0.(xgrid)

for k in eachindex(t)
U[k+1,:] .= U[k,:] + D * U[k,:].^2;
end

return t, U

end

### MAIN LOOP ###

#Domain limits
west = -15;
east = 15;

#number of cells
m = 300;

#stepsize
dx = (east - west)/m;

#Simulation time
T = 13

#Operator's order of accuracy
k = 2;

# 1D Staggered grid
xgrid = [west; (west + (dx/2)):dx: (east - (dx/2)); east];

# Initial Condition
u0(x) = exp.(-(x.^2)/50);

t, U = upwind_burgers(u0, xgrid, T, k, m, dx)

path = joinpath(@__DIR__, "output") # Output path to store generated plots
mkpath(path)


animation = Plots.@animate for k in eachindex(t)
Plots.plot(xgrid, U[k,:];
label = "approximated",
xlabel = "x",
ylabel = "u(x,t)",
grid = true,
title = "1D Inviscid Burgers' Equation t = $(round(t[k]; digits=3))",
legend = :topleft
)
end


Plots.gif(animation, joinpath(path,"burgers1D.gif"), fps=10)

Plots.png(
Plots.plot(xgrid, U[end,:];
label = "approximated",
xlabel = "x",
ylabel = "u(x,t)",
grid = true,
title = "1D Inviscid Burgers' Equation t = $(round(t[end]; digits=3))",
legend = :topleft
),
joinpath(path,"burgers_end.png"),
)

136 changes: 136 additions & 0 deletions julia/MOLE.jl/examples/hyperbolic/hyperbolic1D.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
#=
Julia implementation of the 1D Advection equation with periodic boundary conditions
from MATLAB MOLE example using the Leapfrog Scheme
=#

using Plots
import MOLE: Operators, BCs

function advection_hyperbolic(u0, a, grid, T, k, m, dx)
#Solves the 1D Advection equation using MOLE Operators
#=
INPUTS:
u0 : Initial condition
a : velocity
grid : staggered grid
T : final time
k : Operator order of accuracy
m : number of cells
OUTPUTS:
U : solution
t : time interval
=#
#CFL condition for explicit schemes
dt = dx/abs(a);

#Create stepsize for time with given T
t = collect(0.0:dt:T)

#Use of MOLE Operators
D = Operators.div(k,m,dx);
I = Operators.interpol(m,0.5);

#Periodic Boundary Conditions imposed on Divergence Operator
D[1, 2] = 1/(2*dx);
D[1, end-1] = -1/(2*dx);
D[end, 2] = 1/(2*dx);
D[end, end-1] = -1/(2*dx);

#Premultiply out of time loop (does not change)
D = -a*dt*2 *D*I;

#Create an array that holds solution at each time step
U = zeros(length(t)+2, length(grid))

#Set initial condition at first time element
U[1,:] .= u0.(grid)

#Leapfrog scheme requires two steps, hence we would use Euler's step
U[2,:] .= U[1,:] + D/2*U[1,:];

for k in eachindex(t)
U[k+2,:] .= U[k,:] + D * U[k+1,:];
end

return t, U
end

### MAIN LOOP ###

#Domain limits
west = 0;
east = 1;

#velocity
a = 1;

#number of cells
m = 50;

#stepsize
dx = (east - west) / m;

#Simulation time
T = 1;

#Operator's order of accuracy
k = 2;

#1D Staggered grid
xgrid = [west; (west + (dx/2)):dx: (east - (dx/2)); east];

#Initial Condition
u0(x) = sin.(2 * π * x);

t, U = advection_hyperbolic(u0, a, xgrid, T, k, m, dx)

#Output path to store generated plot
path = joinpath(@__DIR__, "output")

#Creation of animation
animation = Plots.@animate for k in eachindex(t)
Plots.plot(xgrid, U[k,:];
label = "approximated",
xlabel = "x",
ylabel = "u(x,t)",
grid = true,
ls = :dot,
lw = 3,
title = "1D Advection Equation with Periodic BC t = $(round(t[k], sigdigits=2))",
legend = :bottomright,
xlims = (west, east),
ylims = (-1.5, 1.5)
)
Plots.plot!(xgrid, sin.(2*π .*(xgrid .- a*t[k]));
label = "exact",
)
end

#Storing animation as gif to output directory
Plots.gif(animation, joinpath(path, "hyperbolic1D.gif"), fps=10)

#Creating plot object for approximation
p1 = plot(xgrid, U[end-2,:]; #Due to length of t and U being off by 2
label = "approximated",
xlabel = "x",
ylabel = "u(x,t)",
grid = true,
ls = :dot,
lw = 3,
title = "1D Advection Equation with Periodic BC t = $(round(t[end], sigdigits=2))",
legend = :bottomright,
xlims = (west, east),
ylims = (-1.5, 1.5)
)
#Mutating plot to include exact solution
plot!(xgrid, sin.(2*π .*(xgrid .- a*t[end]));
label = "exact",
)

#Storing png file of last iteration
Plots.png(
p1,
joinpath(path, "hyperbolic_end.png")
)


3 changes: 2 additions & 1 deletion julia/MOLE.jl/src/Operators/Operators.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@ module Operators
include("gradient.jl")
include("divergence.jl")
include("laplacian.jl")
include("interpol.jl")

end # module Operators
end # module Operators
Loading
Loading