Skip to content

Commit 11e08a6

Browse files
(0.97.6) Move the computation of flux BC before the time-stepping (#4696)
* go ahead * ad project * fix tests * start with compute * more changes * more changes * more fixes * Update cubed_sphere_exchange_bcs.jl * Update compute_hydrostatic_flux_bcs.jl * Update hydrostatic_free_surface_tendency_kernel_functions.jl * Update explicit_free_surface.jl --------- Co-authored-by: Navid C. Constantinou <[email protected]>
1 parent c7c0984 commit 11e08a6

20 files changed

+142
-143
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "Oceananigans"
22
uuid = "9e8cae18-63c1-5223-a75c-80ca9d6e9a09"
33
authors = ["Climate Modeling Alliance and contributors"]
4-
version = "0.97.5"
4+
version = "0.97.6"
55

66
[deps]
77
Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"

src/BoundaryConditions/BoundaryConditions.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export
77
FluxBoundaryCondition, ValueBoundaryCondition, GradientBoundaryCondition, DistributedCommunicationBoundaryCondition,
88
validate_boundary_condition_topology, validate_boundary_condition_architecture,
99
FieldBoundaryConditions,
10-
apply_x_bcs!, apply_y_bcs!, apply_z_bcs!,
10+
compute_x_bcs!, compute_y_bcs!, compute_z_bcs!,
1111
fill_halo_regions!
1212

1313
using Adapt
@@ -35,7 +35,7 @@ include("fill_halo_regions_flux.jl")
3535
include("fill_halo_regions_nothing.jl")
3636
include("fill_halo_regions_zipper.jl")
3737

38-
include("apply_flux_bcs.jl")
38+
include("compute_flux_bcs.jl")
3939

4040
include("update_boundary_conditions.jl")
4141
include("polar_boundary_condition.jl")

src/BoundaryConditions/apply_flux_bcs.jl renamed to src/BoundaryConditions/compute_flux_bcs.jl

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -9,95 +9,95 @@ using Oceananigans.Grids: AbstractGrid
99
#####
1010

1111
# Unpack
12-
apply_x_bcs!(Gc, c, args...) = apply_x_bcs!(Gc, Gc.grid, c, c.boundary_conditions.west, c.boundary_conditions.east, args...)
13-
apply_y_bcs!(Gc, c, args...) = apply_y_bcs!(Gc, Gc.grid, c, c.boundary_conditions.south, c.boundary_conditions.north, args...)
14-
apply_z_bcs!(Gc, c, args...) = apply_z_bcs!(Gc, Gc.grid, c, c.boundary_conditions.bottom, c.boundary_conditions.top, args...)
12+
compute_x_bcs!(Gc, c, args...) = compute_x_bcs!(Gc, Gc.grid, c, c.boundary_conditions.west, c.boundary_conditions.east, args...)
13+
compute_y_bcs!(Gc, c, args...) = compute_y_bcs!(Gc, Gc.grid, c, c.boundary_conditions.south, c.boundary_conditions.north, args...)
14+
compute_z_bcs!(Gc, c, args...) = compute_z_bcs!(Gc, Gc.grid, c, c.boundary_conditions.bottom, c.boundary_conditions.top, args...)
1515

1616
# Shortcuts for...
1717
#
1818
# Nothing tendencies.
19-
apply_x_bcs!(::Nothing, args...) = nothing
20-
apply_y_bcs!(::Nothing, args...) = nothing
21-
apply_z_bcs!(::Nothing, args...) = nothing
19+
compute_x_bcs!(::Nothing, args...) = nothing
20+
compute_y_bcs!(::Nothing, args...) = nothing
21+
compute_z_bcs!(::Nothing, args...) = nothing
2222

2323
# Not-flux boundary conditions
2424
const NotFluxBC = Union{PBC, MCBC, DCBC, VBC, GBC, OBC, ZFBC, Nothing}
2525

26-
apply_x_bcs!(Gc, ::AbstractGrid, c, ::NotFluxBC, ::NotFluxBC, ::AbstractArchitecture, args...) = nothing
27-
apply_y_bcs!(Gc, ::AbstractGrid, c, ::NotFluxBC, ::NotFluxBC, ::AbstractArchitecture, args...) = nothing
28-
apply_z_bcs!(Gc, ::AbstractGrid, c, ::NotFluxBC, ::NotFluxBC, ::AbstractArchitecture, args...) = nothing
26+
compute_x_bcs!(Gc, ::AbstractGrid, c, ::NotFluxBC, ::NotFluxBC, ::AbstractArchitecture, args...) = nothing
27+
compute_y_bcs!(Gc, ::AbstractGrid, c, ::NotFluxBC, ::NotFluxBC, ::AbstractArchitecture, args...) = nothing
28+
compute_z_bcs!(Gc, ::AbstractGrid, c, ::NotFluxBC, ::NotFluxBC, ::AbstractArchitecture, args...) = nothing
2929

3030
# The real deal
3131
"""
3232
Apply flux boundary conditions to a field `c` by adding the associated flux divergence to
3333
the source term `Gc` at the left and right.
3434
"""
35-
apply_x_bcs!(Gc, grid::AbstractGrid, c, west_bc, east_bc, arch::AbstractArchitecture, args...) =
36-
launch!(arch, grid, :yz, _apply_x_bcs!, Gc, instantiated_location(Gc), grid, west_bc, east_bc, Tuple(args))
35+
compute_x_bcs!(Gc, grid::AbstractGrid, c, west_bc, east_bc, arch::AbstractArchitecture, args...) =
36+
launch!(arch, grid, :yz, _compute_x_bcs!, Gc, instantiated_location(Gc), grid, west_bc, east_bc, Tuple(args))
3737

3838
"""
3939
Apply flux boundary conditions to a field `c` by adding the associated flux divergence to
4040
the source term `Gc` at the left and right.
4141
"""
42-
apply_y_bcs!(Gc, grid::AbstractGrid, c, south_bc, north_bc, arch::AbstractArchitecture, args...) =
43-
launch!(arch, grid, :xz, _apply_y_bcs!, Gc, instantiated_location(Gc), grid, south_bc, north_bc, Tuple(args))
42+
compute_y_bcs!(Gc, grid::AbstractGrid, c, south_bc, north_bc, arch::AbstractArchitecture, args...) =
43+
launch!(arch, grid, :xz, _compute_y_bcs!, Gc, instantiated_location(Gc), grid, south_bc, north_bc, Tuple(args))
4444

4545
"""
4646
Apply flux boundary conditions to a field `c` by adding the associated flux divergence to
4747
the source term `Gc` at the top and bottom.
4848
"""
49-
apply_z_bcs!(Gc, grid::AbstractGrid, c, bottom_bc, top_bc, arch::AbstractArchitecture, args...) =
50-
launch!(arch, grid, :xy, _apply_z_bcs!, Gc, instantiated_location(Gc), grid, bottom_bc, top_bc, Tuple(args))
49+
compute_z_bcs!(Gc, grid::AbstractGrid, c, bottom_bc, top_bc, arch::AbstractArchitecture, args...) =
50+
launch!(arch, grid, :xy, _compute_z_bcs!, Gc, instantiated_location(Gc), grid, bottom_bc, top_bc, Tuple(args))
5151

5252
"""
53-
_apply_x_bcs!(Gc, grid, west_bc, east_bc, args...)
53+
_compute_x_bcs!(Gc, grid, west_bc, east_bc, args...)
5454
5555
Apply a west and/or east boundary condition to variable `c`.
5656
"""
57-
@kernel function _apply_x_bcs!(Gc, loc, grid, west_bc, east_bc, args)
57+
@kernel function _compute_x_bcs!(Gc, loc, grid, west_bc, east_bc, args)
5858
j, k = @index(Global, NTuple)
59-
apply_x_west_bc!(Gc, loc, west_bc, j, k, grid, args...)
60-
apply_x_east_bc!(Gc, loc, east_bc, j, k, grid, args...)
59+
compute_x_west_bc!(Gc, loc, west_bc, j, k, grid, args...)
60+
compute_x_east_bc!(Gc, loc, east_bc, j, k, grid, args...)
6161
end
6262

6363
"""
64-
_apply_y_bcs!(Gc, grid, south_bc, north_bc, args...)
64+
_compute_y_bcs!(Gc, grid, south_bc, north_bc, args...)
6565
6666
Apply a south and/or north boundary condition to variable `c`.
6767
"""
68-
@kernel function _apply_y_bcs!(Gc, loc, grid, south_bc, north_bc, args)
68+
@kernel function _compute_y_bcs!(Gc, loc, grid, south_bc, north_bc, args)
6969
i, k = @index(Global, NTuple)
70-
apply_y_south_bc!(Gc, loc, south_bc, i, k, grid, args...)
71-
apply_y_north_bc!(Gc, loc, north_bc, i, k, grid, args...)
70+
compute_y_south_bc!(Gc, loc, south_bc, i, k, grid, args...)
71+
compute_y_north_bc!(Gc, loc, north_bc, i, k, grid, args...)
7272
end
7373

7474
"""
75-
_apply_z_bcs!(Gc, grid, bottom_bc, top_bc, args...)
75+
_compute_z_bcs!(Gc, grid, bottom_bc, top_bc, args...)
7676
7777
Apply a top and/or bottom boundary condition to variable `c`.
7878
"""
79-
@kernel function _apply_z_bcs!(Gc, loc, grid, bottom_bc, top_bc, args)
79+
@kernel function _compute_z_bcs!(Gc, loc, grid, bottom_bc, top_bc, args)
8080
i, j = @index(Global, NTuple)
81-
apply_z_bottom_bc!(Gc, loc, bottom_bc, i, j, grid, args...)
82-
apply_z_top_bc!(Gc, loc, top_bc, i, j, grid, args...)
81+
compute_z_bottom_bc!(Gc, loc, bottom_bc, i, j, grid, args...)
82+
compute_z_top_bc!(Gc, loc, top_bc, i, j, grid, args...)
8383
end
8484

8585
# Shortcuts for zero flux or non-flux boundary conditions
86-
@inline apply_x_east_bc!(Gc, loc, ::NotFluxBC, args...) = nothing
87-
@inline apply_x_west_bc!(Gc, loc, ::NotFluxBC, args...) = nothing
88-
@inline apply_y_north_bc!(Gc, loc, ::NotFluxBC, args...) = nothing
89-
@inline apply_y_south_bc!(Gc, loc, ::NotFluxBC, args...) = nothing
90-
@inline apply_z_top_bc!(Gc, loc, ::NotFluxBC, args...) = nothing
91-
@inline apply_z_bottom_bc!(Gc, loc, ::NotFluxBC, args...) = nothing
86+
@inline compute_x_east_bc!(Gc, loc, ::NotFluxBC, args...) = nothing
87+
@inline compute_x_west_bc!(Gc, loc, ::NotFluxBC, args...) = nothing
88+
@inline compute_y_north_bc!(Gc, loc, ::NotFluxBC, args...) = nothing
89+
@inline compute_y_south_bc!(Gc, loc, ::NotFluxBC, args...) = nothing
90+
@inline compute_z_top_bc!(Gc, loc, ::NotFluxBC, args...) = nothing
91+
@inline compute_z_bottom_bc!(Gc, loc, ::NotFluxBC, args...) = nothing
9292

9393
# shortcut for the zipper BC
94-
@inline apply_y_north_bc!(Gc, loc, ::ZBC, args...) = nothing
94+
@inline compute_y_north_bc!(Gc, loc, ::ZBC, args...) = nothing
9595

9696
@inline flip(::Center) = Face()
9797
@inline flip(::Face) = Center()
9898

9999
"""
100-
apply_x_west_bc!(Gc, loc, west_flux::BC{<:Flux}, j, k, grid, args...)
100+
compute_x_west_bc!(Gc, loc, west_flux::BC{<:Flux}, j, k, grid, args...)
101101
102102
Add the flux divergence associated with a west flux boundary condition on `c`.
103103
Note that because
@@ -111,26 +111,26 @@ If `west_bc.condition` is a function, the function must have the signature
111111
112112
The same logic holds for south and bottom boundary conditions in `y`, and `z`, respectively.
113113
"""
114-
@inline function apply_x_west_bc!(Gc, loc, west_flux::BC{<:Flux}, j, k, grid, args...)
114+
@inline function compute_x_west_bc!(Gc, loc, west_flux::BC{<:Flux}, j, k, grid, args...)
115115
LX, LY, LZ = loc
116116
@inbounds Gc[1, j, k] += getbc(west_flux, j, k, grid, args...) * Ax(1, j, k, grid, flip(LX), LY, LZ) / volume(1, j, k, grid, LX, LY, LZ)
117117
return nothing
118118
end
119119

120-
@inline function apply_y_south_bc!(Gc, loc, south_flux::BC{<:Flux}, i, k, grid, args...)
120+
@inline function compute_y_south_bc!(Gc, loc, south_flux::BC{<:Flux}, i, k, grid, args...)
121121
LX, LY, LZ = loc
122122
@inbounds Gc[i, 1, k] += getbc(south_flux, i, k, grid, args...) * Ay(i, 1, k, grid, LX, flip(LY), LZ) / volume(i, 1, k, grid, LX, LY, LZ)
123123
return nothing
124124
end
125125

126-
@inline function apply_z_bottom_bc!(Gc, loc, bottom_flux::BC{<:Flux}, i, j, grid, args...)
126+
@inline function compute_z_bottom_bc!(Gc, loc, bottom_flux::BC{<:Flux}, i, j, grid, args...)
127127
LX, LY, LZ = loc
128128
@inbounds Gc[i, j, 1] += getbc(bottom_flux, i, j, grid, args...) * Az(i, j, 1, grid, LX, LY, flip(LZ)) / volume(i, j, 1, grid, LX, LY, LZ)
129129
return nothing
130130
end
131131

132132
"""
133-
apply_x_east_bc!(Gc, loc, east_flux::BC{<:Flux}, j, k, grid, args...)
133+
compute_x_east_bc!(Gc, loc, east_flux::BC{<:Flux}, j, k, grid, args...)
134134
135135
Add the part of flux divergence associated with a east boundary condition on `c`.
136136
Note that because
@@ -144,19 +144,19 @@ If `east_bc.condition` is a function, the function must have the signature
144144
145145
The same logic holds for north and top boundary conditions in `y`, and `z`, respectively.
146146
"""
147-
@inline function apply_x_east_bc!(Gc, loc, east_flux::BC{<:Flux}, j, k, grid, args...)
147+
@inline function compute_x_east_bc!(Gc, loc, east_flux::BC{<:Flux}, j, k, grid, args...)
148148
LX, LY, LZ = loc
149149
@inbounds Gc[grid.Nx, j, k] -= getbc(east_flux, j, k, grid, args...) * Ax(grid.Nx+1, j, k, grid, flip(LX), LY, LZ) / volume(grid.Nx, j, k, grid, LX, LY, LZ)
150150
return nothing
151151
end
152152

153-
@inline function apply_y_north_bc!(Gc, loc, north_flux::BC{<:Flux}, i, k, grid, args...)
153+
@inline function compute_y_north_bc!(Gc, loc, north_flux::BC{<:Flux}, i, k, grid, args...)
154154
LX, LY, LZ = loc
155155
@inbounds Gc[i, grid.Ny, k] -= getbc(north_flux, i, k, grid, args...) * Ay(i, grid.Ny+1, k, grid, LX, flip(LY), LZ) / volume(i, grid.Ny, k, grid, LX, LY, LZ)
156156
return nothing
157157
end
158158

159-
@inline function apply_z_top_bc!(Gc, loc, top_flux::BC{<:Flux}, i, j, grid, args...)
159+
@inline function compute_z_top_bc!(Gc, loc, top_flux::BC{<:Flux}, i, j, grid, args...)
160160
LX, LY, LZ = loc
161161
@inbounds Gc[i, j, grid.Nz] -= getbc(top_flux, i, j, grid, args...) * Az(i, j, grid.Nz+1, grid, LX, LY, flip(LZ)) / volume(i, j, grid.Nz, grid, LX, LY, LZ)
162162
return nothing

src/CubedSpheres/cubed_sphere_exchange_bcs.jl

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
11
using Adapt
22

33
using Oceananigans.Architectures: AbstractArchitecture
4-
using Oceananigans.Grids: AbstractGrid
54
using Oceananigans.BoundaryConditions
65
using Oceananigans.BoundaryConditions: AbstractBoundaryConditionClassification
6+
using Oceananigans.Grids: AbstractGrid
77

88
import Base: show
9-
10-
import Oceananigans.BoundaryConditions: bc_str
11-
129
import Oceananigans.BoundaryConditions:
13-
apply_x_bcs!,
14-
apply_y_bcs!,
15-
apply_x_east_bc!,
16-
apply_x_west_bc!,
17-
apply_y_south_bc!,
18-
apply_y_north_bc!
10+
bc_str,
11+
compute_x_bcs!,
12+
compute_y_bcs!,
13+
compute_x_east_bc!,
14+
compute_x_west_bc!,
15+
compute_y_south_bc!,
16+
compute_y_north_bc!
1917

2018
struct CubedSphereExchange <: AbstractBoundaryConditionClassification end
2119

2220
const CubedSphereExchangeBC = BoundaryCondition{<:CubedSphereExchange}
2321

24-
bc_str(::CubedSphereExchangeBC) ="CubedSphereExchange"
22+
bc_str(::CubedSphereExchangeBC) = "CubedSphereExchange"
2523

2624
CubedSphereExchangeBoundaryCondition(val; kwargs...) = BoundaryCondition(CubedSphereExchange, val; kwargs...)
2725

@@ -89,10 +87,10 @@ Adapt.adapt_structure(to, ::CubedSphereExchangeInformation) = nothing
8987
Adapt.adapt_structure(to, ::CubedSphereExchangeBC) = nothing
9088

9189
# Don't "apply fluxes" across CubedSphere boundaries
92-
@inline apply_x_east_bc!( Gc, loc, ::CubedSphereExchangeBC, args...) = nothing
93-
@inline apply_x_west_bc!( Gc, loc, ::CubedSphereExchangeBC, args...) = nothing
94-
@inline apply_y_north_bc!( Gc, loc, ::CubedSphereExchangeBC, args...) = nothing
95-
@inline apply_y_south_bc!( Gc, loc, ::CubedSphereExchangeBC, args...) = nothing
90+
@inline compute_x_east_bc!(Gc, loc, ::CubedSphereExchangeBC, args...) = nothing
91+
@inline compute_x_west_bc!(Gc, loc, ::CubedSphereExchangeBC, args...) = nothing
92+
@inline compute_y_north_bc!(Gc, loc, ::CubedSphereExchangeBC, args...) = nothing
93+
@inline compute_y_south_bc!(Gc, loc, ::CubedSphereExchangeBC, args...) = nothing
9694

97-
apply_x_bcs!(Gc, ::AbstractGrid, c, ::CubedSphereExchangeBC, ::CubedSphereExchangeBC, ::AbstractArchitecture, args...) = nothing
98-
apply_y_bcs!(Gc, ::AbstractGrid, c, ::CubedSphereExchangeBC, ::CubedSphereExchangeBC, ::AbstractArchitecture, args...) = nothing
95+
compute_x_bcs!(Gc, ::AbstractGrid, c, ::CubedSphereExchangeBC, ::CubedSphereExchangeBC, ::AbstractArchitecture, args...) = nothing
96+
compute_y_bcs!(Gc, ::AbstractGrid, c, ::CubedSphereExchangeBC, ::CubedSphereExchangeBC, ::AbstractArchitecture, args...) = nothing

src/Models/HydrostaticFreeSurfaceModels/HydrostaticFreeSurfaceModels.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ include("barotropic_pressure_correction.jl")
134134
include("hydrostatic_free_surface_tendency_kernel_functions.jl")
135135
include("compute_hydrostatic_free_surface_tendencies.jl")
136136
include("compute_hydrostatic_free_surface_buffers.jl")
137+
include("compute_hydrostatic_flux_bcs.jl")
137138
include("update_hydrostatic_free_surface_model_state.jl")
138139
include("hydrostatic_free_surface_ab2_step.jl")
139140
include("hydrostatic_free_surface_rk3_step.jl")
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import Oceananigans.TimeSteppers: compute_flux_bc_tendencies!
2+
3+
#####
4+
##### Boundary contributions to hydrostatic free surface model
5+
#####
6+
7+
function compute_flux_bcs!(Gcⁿ, c, arch, args)
8+
compute_x_bcs!(Gcⁿ, c, arch, args...)
9+
compute_y_bcs!(Gcⁿ, c, arch, args...)
10+
compute_z_bcs!(Gcⁿ, c, arch, args...)
11+
return nothing
12+
end
13+
14+
""" Apply boundary conditions by adding flux divergences to the right-hand-side. """
15+
function compute_flux_bc_tendencies!(model::HydrostaticFreeSurfaceModel)
16+
17+
Gⁿ = model.timestepper.Gⁿ
18+
grid = model.grid
19+
arch = architecture(grid)
20+
velocities = model.velocities
21+
tracers = model.tracers
22+
23+
args = (model.clock, fields(model), model.closure, model.buoyancy)
24+
25+
26+
# Velocity fields
27+
for i in (:u, :v)
28+
@apply_regionally compute_flux_bcs!(Gⁿ[i], velocities[i], arch, args)
29+
end
30+
31+
# Tracer fields
32+
for i in propertynames(tracers)
33+
@apply_regionally compute_flux_bcs!(Gⁿ[i], tracers[i], arch, args)
34+
end
35+
36+
return nothing
37+
end

src/Models/HydrostaticFreeSurfaceModels/compute_hydrostatic_free_surface_tendencies.jl

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -33,23 +33,11 @@ function compute_tendencies!(model::HydrostaticFreeSurfaceModel, callbacks)
3333
compute_hydrostatic_free_surface_tendency_contributions!(model, kernel_parameters; active_cells_map)
3434
complete_communication_and_compute_buffer!(model, grid, arch)
3535

36-
# Calculate contributions to momentum and tracer tendencies from user-prescribed fluxes across the
37-
# boundaries of the domain
38-
compute_hydrostatic_boundary_tendency_contributions!(model.timestepper.Gⁿ,
39-
model.architecture,
40-
model.velocities,
41-
model.tracers,
42-
model.clock,
43-
fields(model),
44-
model.closure,
45-
model.buoyancy)
46-
4736
for callback in callbacks
4837
callback.callsite isa TendencyCallsite && callback(model)
4938
end
5039

5140
update_tendencies!(model.biogeochemistry, model)
52-
multiply_by_grid_scaling!(model.timestepper.Gⁿ, model.tracers, model.grid)
5341

5442
return nothing
5543
end
@@ -106,17 +94,6 @@ function compute_hydrostatic_free_surface_tendency_contributions!(model, kernel_
10694
return nothing
10795
end
10896

109-
#####
110-
##### Boundary condributions to hydrostatic free surface model
111-
#####
112-
113-
function apply_flux_bcs!(Gcⁿ, c, arch, args)
114-
apply_x_bcs!(Gcⁿ, c, arch, args...)
115-
apply_y_bcs!(Gcⁿ, c, arch, args...)
116-
apply_z_bcs!(Gcⁿ, c, arch, args...)
117-
return nothing
118-
end
119-
12097
""" Calculate momentum tendencies if momentum is not prescribed."""
12198
function compute_hydrostatic_momentum_tendencies!(model, velocities, kernel_parameters; active_cells_map=nothing)
12299

@@ -157,25 +134,6 @@ function compute_hydrostatic_momentum_tendencies!(model, velocities, kernel_para
157134
return nothing
158135
end
159136

160-
161-
""" Apply boundary conditions by adding flux divergences to the right-hand-side. """
162-
function compute_hydrostatic_boundary_tendency_contributions!(Gⁿ, arch, velocities, tracers, args...)
163-
164-
args = Tuple(args)
165-
166-
# Velocity fields
167-
for i in (:u, :v)
168-
apply_flux_bcs!(Gⁿ[i], velocities[i], arch, args)
169-
end
170-
171-
# Tracer fields
172-
for i in propertynames(tracers)
173-
apply_flux_bcs!(Gⁿ[i], tracers[i], arch, args)
174-
end
175-
176-
return nothing
177-
end
178-
179137
#####
180138
##### Tendency calculators for u, v
181139
#####

0 commit comments

Comments
 (0)