Skip to content

Commit 24d6838

Browse files
Merge pull request #2375 from CliMA/ne/fd_grid
Add support for FiniteDifferenceSpaces
2 parents 25fcf87 + 68ca254 commit 24d6838

File tree

21 files changed

+231
-59
lines changed

21 files changed

+231
-59
lines changed

NEWS.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ ClimaCore.jl Release Notes
44
main
55
-------
66

7+
8+
v0.14.43
9+
-------
10+
11+
- Add support for horizontal operators on column spaces [2375](https://github.com/Clima/ClimaCore.jl/pull/2375)
12+
713
v0.14.42
814
-------
915

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ClimaCore"
22
uuid = "d414da3d-4745-48bb-8d80-42e94e092884"
33
authors = ["CliMA Contributors <[email protected]>"]
4-
version = "0.14.42"
4+
version = "0.14.43"
55

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

src/CommonGrids/CommonGrids.jl

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ z_domain = Domains.IntervalDomain(
4040
)
4141
z_mesh = Meshes.IntervalMesh(z_domain; nelems = z_elem)
4242
h_grid = Grids.SpectralElementGrid2D(h_topology, quad)
43-
z_topology = Topologies.IntervalTopology(context, z_mesh)
43+
z_topology = Topologies.IntervalTopology(ClimaComms.SingletonCommsContext(device), z_mesh)
4444
z_grid = Grids.FiniteDifferenceGrid(z_topology)
4545
grid = Grids.ExtrudedFiniteDifferenceGrid(
4646
h_grid,
@@ -441,6 +441,19 @@ function Box3DGrid(
441441
periodic_x,
442442
periodic_y,
443443
),
444+
Topologies.spacefillingcurve(
445+
DefaultRectangleXYMesh(
446+
FT;
447+
x_min,
448+
x_max,
449+
y_min,
450+
y_max,
451+
x_elem,
452+
y_elem,
453+
periodic_x,
454+
periodic_y,
455+
),
456+
),
444457
),
445458
z_mesh::Meshes.IntervalMesh = DefaultZMesh(
446459
FT;

src/CommonGrids/Helpers.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,12 @@ function DefaultSliceXMesh(
2727
x_elem::Integer,
2828
) where {FT}
2929

30-
x1boundary = (:east, :west)
31-
z_boundary_names = (:bottom, :top)
30+
x1boundary = periodic_x ? nothing : (:east, :west)
3231
h_domain = Domains.IntervalDomain(
3332
Geometry.XPoint{FT}(x_min),
3433
Geometry.XPoint{FT}(x_max);
3534
periodic = periodic_x,
36-
boundary_names = (:east, :west),
35+
boundary_names = x1boundary,
3736
)
3837
return Meshes.IntervalMesh(h_domain; nelems = x_elem)
3938
end
@@ -93,8 +92,9 @@ function DefaultRectangleXYMesh(
9392
periodic_x::Bool,
9493
periodic_y::Bool,
9594
) where {FT <: AbstractFloat}
96-
x1boundary = (:east, :west)
97-
x2boundary = (:south, :north)
95+
x1boundary = periodic_x ? nothing : (:east, :west)
96+
x2boundary = periodic_y ? nothing : (:south, :north)
97+
9898
domain = Domains.RectangleDomain(
9999
Domains.IntervalDomain(
100100
Geometry.XPoint{FT}(x_min),

src/Domains/Domains.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ function IntervalDomain(
5656
if !periodic && isnothing(boundary_names)
5757
throw(
5858
ArgumentError(
59-
"if `periodic=false` then an `boundary_names::Tuple{Symbol,Symbol}` keyword argument is required.",
59+
"if `periodic=false` then a `boundary_names::Tuple{Symbol,Symbol}` keyword argument is required.",
6060
),
6161
)
6262
end

src/Fields/indices.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,32 @@ function byslab(
245245
end
246246
end
247247

248+
function byslab(
249+
fn,
250+
::ClimaComms.AbstractCPUDevice,
251+
space::Spaces.CenterFiniteDifferenceSpace,
252+
)
253+
Nv = Spaces.nlevels(space)
254+
@inbounds begin
255+
for v in 1:Nv
256+
fn(SlabIndex(v, 1))
257+
end
258+
end
259+
end
260+
261+
function byslab(
262+
fn,
263+
::ClimaComms.AbstractCPUDevice,
264+
space::Spaces.FaceFiniteDifferenceSpace,
265+
)
266+
Nv = Spaces.nlevels(space)
267+
@inbounds begin
268+
for v in 1:Nv
269+
fn(SlabIndex(v - half, 1))
270+
end
271+
end
272+
end
273+
248274
universal_index(colidx::Fields.ColumnIndex{2}) =
249275
CartesianIndex(colidx.ij[1], colidx.ij[2], 1, 1, colidx.h)
250276

src/Geometry/axistensors.jl

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,8 @@ const AxisVector{T, A1, S} = AxisTensor{T, 1, Tuple{A1}, S}
219219
AxisVector(ax::A1, v::SVector{N, T}) where {A1 <: AbstractAxis, N, T} =
220220
AxisVector{T, A1, SVector{N, T}}((ax,), v)
221221

222+
(AxisVector{T, A, SVector{0, T}} where {T})() where {A} =
223+
AxisVector(A.instance, SVector{0, T}())
222224
(AxisVector{T, A, SVector{1, T}} where {T})(arg1::Real) where {A} =
223225
AxisVector(A.instance, SVector(arg1))
224226
(AxisVector{T, A, SVector{2, T}} where {T})(arg1::Real, arg2::Real) where {A} =
@@ -306,11 +308,12 @@ const CovariantTensor = Union{CovariantVector, Covariant2Tensor}
306308
const ContravariantTensor = Union{ContravariantVector, Contravariant2Tensor}
307309
const CartesianTensor = Union{CartesianVector, Cartesian2Tensor}
308310
const LocalTensor = Union{LocalVector, Local2Tensor}
311+
for I in [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
309312

310-
for I in [(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
311-
strI = join(I)
313+
strI = isempty(I) ? "Null" : join(I)
312314
N = length(I)
313-
strUVW = join(map(i -> [:U, :V, :W][i], I))
315+
316+
strUVW = isempty(I) ? "Null" : join(map(i -> [:U, :V, :W][i], I))
314317
@eval begin
315318
const $(Symbol(:Covariant, strI, :Axis)) = CovariantAxis{$I}
316319
const $(Symbol(:Covariant, strI, :Vector)){T} =
@@ -467,7 +470,7 @@ end
467470
end
468471
push!(vals, val)
469472
end
470-
return :(@inbounds AxisVector(ato, SVector($(vals...))))
473+
return :(@inbounds AxisVector(ato, SVector{$(length(Ito)), $T}($(vals...))))
471474
end
472475

473476
function _transform(

src/Geometry/conversions.jl

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -501,13 +501,16 @@ Curl is only defined for `CovariantVector`` field input types.
501501
| Covariant12Vector | (1,2) | Contravariant3Vector |
502502
| Covariant3Vector | (1,2) | Contravariant12Vector |
503503
| Covariant123Vector | (1,2) | Contravariant123Vector |
504-
| Covariant1Vector | (1,) | Contravariant1Vector |
504+
| Covariant1Vector | (1,) | ContravariantNullVector |
505505
| Covariant2Vector | (1,) | Contravariant3Vector |
506506
| Covariant3Vector | (1,) | Contravariant2Vector |
507+
| Covariant13Vector | (1,) | Contravariant2Vector |
508+
| Covariant123Vector | (1,) | Contravariant23Vector |
507509
| Covariant12Vector | (3,) | Contravariant12Vector |
508510
| Covariant1Vector | (3,) | Contravariant2Vector |
509511
| Covariant2Vector | (3,) | Contravariant1Vector |
510512
| Covariant3Vector | (3,) | Contravariant3Vector |
513+
| Any CovariantVector | () | ContravariantNullVector |
511514
"""
512515
@inline curl_result_type(::Val{(1, 2)}, ::Type{Covariant3Vector{FT}}) where {FT} =
513516
Contravariant12Vector{FT}
@@ -516,9 +519,8 @@ Curl is only defined for `CovariantVector`` field input types.
516519
@inline curl_result_type(::Val{(1, 2)}, ::Type{Covariant123Vector{FT}}) where {FT} =
517520
Contravariant123Vector{FT}
518521

519-
520522
@inline curl_result_type(::Val{(1,)}, ::Type{Covariant1Vector{FT}}) where {FT} =
521-
Contravariant1Vector{FT} # not strictly correct: should be a zero Vector
523+
ContravariantNullVector{FT}
522524
@inline curl_result_type(::Val{(1,)}, ::Type{Covariant2Vector{FT}}) where {FT} =
523525
Contravariant3Vector{FT}
524526
@inline curl_result_type(::Val{(1,)}, ::Type{Covariant3Vector{FT}}) where {FT} =
@@ -537,6 +539,9 @@ Curl is only defined for `CovariantVector`` field input types.
537539
@inline curl_result_type(::Val{(3,)}, ::Type{Covariant3Vector{FT}}) where {FT} =
538540
Contravariant3Vector{FT}
539541

542+
@inline curl_result_type(_, ::Type{<:CovariantVector{FT}}) where {FT} =
543+
ContravariantNullVector{FT}
544+
540545
_norm_sqr(x, local_geometry::LocalGeometry) = sum(x -> _norm_sqr(x, local_geometry), x)
541546
_norm_sqr(x::Number, ::LocalGeometry) = LinearAlgebra.norm_sqr(x)
542547
_norm_sqr(x::AbstractArray, ::LocalGeometry) = LinearAlgebra.norm_sqr(x)

0 commit comments

Comments
 (0)