Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
41 changes: 35 additions & 6 deletions src/BoundaryConditions/fill_halo_regions_flux.jl
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,38 @@
##### Combined halo filling functions
#####

@inline _fill_west_halo!(j, k, grid, c, ::FBC, args...) = _fill_flux_west_halo!(1, j, k, grid, c)
@inline _fill_east_halo!(j, k, grid, c, ::FBC, args...) = _fill_flux_east_halo!(1, j, k, grid, c)
@inline _fill_south_halo!(i, k, grid, c, ::FBC, args...) = _fill_flux_south_halo!(i, 1, k, grid, c)
@inline _fill_north_halo!(i, k, grid, c, ::FBC, args...) = _fill_flux_north_halo!(i, 1, k, grid, c)
@inline _fill_bottom_halo!(i, j, grid, c, ::FBC, args...) = _fill_flux_bottom_halo!(i, j, 1, grid, c)
@inline _fill_top_halo!(i, j, grid, c, ::FBC, args...) = _fill_flux_top_halo!(i, j, 1, grid, c)
@inline function _fill_west_halo!(j, k, grid, c, ::FBC, args...)
@inbounds for h in 1:grid.Hx
_fill_flux_west_halo!(h, j, k, grid, c)
end
end

@inline function _fill_east_halo!(j, k, grid, c, ::FBC, args...)
@inbounds for h in 1:grid.Hx
_fill_flux_east_halo!(h, j, k, grid, c)
end
end

@inline function _fill_south_halo!(i, k, grid, c, ::FBC, args...)
@inbounds for h in 1:grid.Hy
_fill_flux_south_halo!(i, h, k, grid, c)
end
end

@inline function _fill_north_halo!(i, k, grid, c, ::FBC, args...)
@inbounds for h in 1:grid.Hy
_fill_flux_north_halo!(i, h, k, grid, c)
end
end

@inline function _fill_bottom_halo!(i, j, grid, c, ::FBC, args...)
@inbounds for h in 1:grid.Hz
_fill_flux_bottom_halo!(i, j, h, grid, c)
end
end

@inline function _fill_top_halo!(i, j, grid, c, ::FBC, args...)
@inbounds for h in 1:grid.Hz
_fill_flux_top_halo!(i, j, h, grid, c)
end
end
49 changes: 42 additions & 7 deletions src/BoundaryConditions/fill_halo_regions_open.jl
Original file line number Diff line number Diff line change
@@ -1,10 +1,45 @@
# Open boundary fill
@inline _fill_west_halo!(j, k, grid, c, bc::OBC, loc, args...) = @inbounds c[1, j, k] = getbc(bc, j, k, grid, args...)
@inline _fill_east_halo!(j, k, grid, c, bc::OBC, loc, args...) = @inbounds c[grid.Nx + 1, j, k] = getbc(bc, j, k, grid, args...)
@inline _fill_south_halo!(i, k, grid, c, bc::OBC, loc, args...) = @inbounds c[i, 1, k] = getbc(bc, i, k, grid, args...)
@inline _fill_north_halo!(i, k, grid, c, bc::OBC, loc, args...) = @inbounds c[i, grid.Ny + 1, k] = getbc(bc, i, k, grid, args...)
@inline _fill_bottom_halo!(i, j, grid, c, bc::OBC, loc, args...) = @inbounds c[i, j, 1] = getbc(bc, i, j, grid, args...)
@inline _fill_top_halo!(i, j, grid, c, bc::OBC, loc, args...) = @inbounds c[i, j, grid.Nz + 1] = getbc(bc, i, j, grid, args...)
# Open boundary fill — set the boundary value, then extrapolate (zero gradient) into deeper halo cells
@inline function _fill_west_halo!(j, k, grid, c, bc::OBC, loc, args...)
@inbounds c[1, j, k] = getbc(bc, j, k, grid, args...)
@inbounds for h in 1:grid.Hx
c[1 - h, j, k] = c[1, j, k]
end
end

@inline function _fill_east_halo!(j, k, grid, c, bc::OBC, loc, args...)
@inbounds c[grid.Nx + 1, j, k] = getbc(bc, j, k, grid, args...)
@inbounds for h in 2:grid.Hx
c[grid.Nx + h, j, k] = c[grid.Nx + 1, j, k]
end
end

@inline function _fill_south_halo!(i, k, grid, c, bc::OBC, loc, args...)
@inbounds c[i, 1, k] = getbc(bc, i, k, grid, args...)
@inbounds for h in 1:grid.Hy
c[i, 1 - h, k] = c[i, 1, k]
end
end

@inline function _fill_north_halo!(i, k, grid, c, bc::OBC, loc, args...)
@inbounds c[i, grid.Ny + 1, k] = getbc(bc, i, k, grid, args...)
@inbounds for h in 2:grid.Hy
c[i, grid.Ny + h, k] = c[i, grid.Ny + 1, k]
end
end

@inline function _fill_bottom_halo!(i, j, grid, c, bc::OBC, loc, args...)
@inbounds c[i, j, 1] = getbc(bc, i, j, grid, args...)
@inbounds for h in 1:grid.Hz
c[i, j, 1 - h] = c[i, j, 1]
end
end

@inline function _fill_top_halo!(i, j, grid, c, bc::OBC, loc, args...)
@inbounds c[i, j, grid.Nz + 1] = getbc(bc, i, j, grid, args...)
@inbounds for h in 2:grid.Hz
c[i, j, grid.Nz + h] = c[i, j, grid.Nz + 1]
end
end

@inline function fill_halo_event!(c, kernel!, bcs::Tuple{<:OBC, <:OBC}, loc, grid, args...; fill_open_bcs=true, kwargs...)
if fill_open_bcs
Expand Down
36 changes: 24 additions & 12 deletions src/BoundaryConditions/fill_halo_regions_value_gradient.jl
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,20 @@ end
# ----- interior face
iᴵ = 1 # * interior cell
iᴮ = 1 # ===== western boundary
iᴴ = 0 # * halo cell
# * halo cells (1 to Hx deep)

LX, LY, LZ = loc
Δ = Δx(iᴮ, j, k, grid, flip(LX), LY, LZ) # Δ between first interior and first west halo point, defined at cell face.
@inbounds ∇c = left_gradient(bc, c[iᴵ, j, k], Δ, j, k, grid, args...)
@inbounds c[iᴴ, j, k] = linearly_extrapolate(c[iᴵ, j, k], ∇c, -Δ) # extrapolate westward in -x direction.
@inbounds for h in 1:grid.Hx
c[1 - h, j, k] = linearly_extrapolate(c[iᴵ, j, k], ∇c, -h * Δ) # extrapolate westward in -x direction.
end
end

@inline function _fill_east_halo!(j, k, grid, c, bc::Union{VBC, GBC, MBC}, loc, args...)

# ↑ x ↑
iᴴ = grid.Nx + 1 # * halo cell
# * halo cells (1 to Hx deep)
iᴮ = grid.Nx + 1 # ===== eastern boundary
iᴵ = grid.Nx # * interior cell
# ----- interior face
Expand All @@ -58,7 +60,9 @@ end
LX, LY, LZ = loc
Δ = Δx(iᴮ, j, k, grid, flip(LX), LY, LZ) # Δ between last interior and first east halo point, defined at cell face.
@inbounds ∇c = right_gradient(bc, c[iᴵ, j, k], Δ, j, k, grid, args...)
@inbounds c[iᴴ, j, k] = linearly_extrapolate(c[iᴵ, j, k], ∇c, Δ) # extrapolate eastward in +x direction.
@inbounds for h in 1:grid.Hx
c[grid.Nx + h, j, k] = linearly_extrapolate(c[iᴵ, j, k], ∇c, h * Δ) # extrapolate eastward in +x direction.
end
end

@inline function _fill_south_halo!(i, k, grid, c, bc::Union{VBC, GBC, MBC}, loc, args...)
Expand All @@ -67,18 +71,20 @@ end
# ----- interior face
jᴵ = 1 # * interior cell
jᴮ = 1 # ===== southern boundary
jᴴ = 0 # * halo cell
# * halo cells (1 to Hy deep)

LX, LY, LZ = loc
Δ = Δy(i, jᴮ, k, grid, LX, flip(LY), LZ) # Δ between first interior and first south halo point, defined at cell face.
@inbounds ∇c = left_gradient(bc, c[i, jᴵ, k], Δ, i, k, grid, args...)
@inbounds c[i, jᴴ, k] = linearly_extrapolate(c[i, jᴵ, k], ∇c, -Δ) # extrapolate southward in -y direction.
@inbounds for h in 1:grid.Hy
c[i, 1 - h, k] = linearly_extrapolate(c[i, jᴵ, k], ∇c, -h * Δ) # extrapolate southward in -y direction.
end
end

@inline function _fill_north_halo!(i, k, grid, c, bc::Union{VBC, GBC, MBC}, loc, args...)

# ↑ y ↑
jᴴ = grid.Ny + 1 # * halo cell
# * halo cells (1 to Hy deep)
jᴮ = grid.Ny + 1 # ===== northern boundary
jᴵ = grid.Ny # * interior cell
# ----- interior face
Expand All @@ -87,7 +93,9 @@ end
LX, LY, LZ = loc
Δ = Δy(i, jᴮ, k, grid, LX, flip(LY), LZ) # Δ between first interior and first north halo point, defined at cell face.
@inbounds ∇c = right_gradient(bc, c[i, jᴵ, k], Δ, i, k, grid, args...)
@inbounds c[i, jᴴ, k] = linearly_extrapolate(c[i, jᴵ, k], ∇c, Δ) # extrapolate northward in +y direction.
@inbounds for h in 1:grid.Hy
c[i, grid.Ny + h, k] = linearly_extrapolate(c[i, jᴵ, k], ∇c, h * Δ) # extrapolate northward in +y direction.
end
end

@inline function _fill_bottom_halo!(i, j, grid, c, bc::Union{VBC, GBC, MBC}, loc, args...)
Expand All @@ -96,24 +104,28 @@ end
# ----- interior face
kᴵ = 1 # * interior cell
kᴮ = 1 # ===== bottom boundary
kᴴ = 0 # * halo cell
# * halo cells (1 to Hz deep)

LX, LY, LZ = loc
Δ = Δz(i, j, kᴮ, grid, LX, LY, flip(LZ)) # Δ between first interior and first bottom halo point, defined at cell face.
@inbounds ∇c = left_gradient(bc, c[i, j, kᴵ], Δ, i, j, grid, args...)
@inbounds c[i, j, kᴴ] = linearly_extrapolate(c[i, j, kᴵ], ∇c, -Δ) # extrapolate downward in -z direction.
@inbounds for h in 1:grid.Hz
c[i, j, 1 - h] = linearly_extrapolate(c[i, j, kᴵ], ∇c, -h * Δ) # extrapolate downward in -z direction.
end
end

@inline function _fill_top_halo!(i, j, grid, c, bc::Union{VBC, GBC, MBC}, loc, args...)

# ↑ z ↑
kᴴ = grid.Nz + 1 # * halo cell
# * halo cells (1 to Hz deep)
kᴮ = grid.Nz + 1 # ===== top boundary
kᴵ = grid.Nz # * interior cell
# ----- interior face

LX, LY, LZ = loc
Δ = Δz(i, j, kᴮ, grid, LX, LY, flip(LZ)) # Δ between first interior and first top halo point, defined at cell face.
@inbounds ∇c = right_gradient(bc, c[i, j, kᴵ], Δ, i, j, grid, args...)
@inbounds c[i, j, kᴴ] = linearly_extrapolate(c[i, j, kᴵ], ∇c, Δ) # extrapolate upward in +z direction.
@inbounds for h in 1:grid.Hz
c[i, j, grid.Nz + h] = linearly_extrapolate(c[i, j, kᴵ], ∇c, h * Δ) # extrapolate upward in +z direction.
end
end
Loading