Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 414296a

Browse files
committedApr 11, 2025·
Use TemplateVar for initializing OutputVar
1 parent e65e1f3 commit 414296a

File tree

1 file changed

+119
-114
lines changed

1 file changed

+119
-114
lines changed
 

‎test/test_Var.jl

Lines changed: 119 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@ import OrderedCollections: OrderedDict
88
import Unitful: @u_str
99
import Dates
1010

11+
import ClimaAnalysis.Template:
12+
TemplateVar,
13+
make_template_var,
14+
add_attribs,
15+
add_time_dim,
16+
add_lon_dim,
17+
add_lat_dim,
18+
add_data,
19+
ones_data,
20+
zeros_data,
21+
ones_to_n_data,
22+
initialize
23+
1124
@testset "General" begin
1225
# Add test for short constructor
1326
long = -180.0:180.0 |> collect
@@ -87,12 +100,11 @@ import Dates
87100
end
88101

89102
@testset "Shift longitudes" begin
90-
lon = collect(range(0.0, 360.0, 361))
91-
dims = OrderedDict("lon" => lon)
92-
data = collect(0.0:360.0)
93-
attribs = Dict("long_name" => "hi")
94-
dim_attribs = OrderedDict("lon" => Dict("units" => "degrees"))
95-
var_0_360 = ClimaAnalysis.OutputVar(attribs, dims, dim_attribs, data)
103+
var_0_360 =
104+
make_template_var("lon", long_name = "hi") |>
105+
add_lon_dim(name = "lon", dim = collect(range(0.0, 360.0, 361))) |>
106+
add_data(data = collect(0.0:360.0)) |>
107+
initialize
96108

97109
# Shift longitudes from 0 to 360 degrees to -180 to 180 degrees
98110
var_neg_180_180 = ClimaAnalysis.shift_longitude(var_0_360, -180.0, 180.0)
@@ -108,32 +120,25 @@ end
108120
@test var_0_360.data == collect(range(0.0, 359.0, 360))
109121

110122
# Shift longitudes from 20 to 380 degrees to 40 to 400 degrees
111-
lon = [20.0, 30.0, 40.0, 360.0, 370.0]
112-
dims = OrderedDict("lon" => lon)
113-
data = [1.0, 2.0, 3.0, 4.0, 5.0]
114-
attribs = Dict("long_name" => "hi")
115-
dim_attribs = OrderedDict("lon" => Dict("units" => "degrees"))
116-
var_20_380 = ClimaAnalysis.OutputVar(attribs, dims, dim_attribs, data)
123+
var_20_380 =
124+
make_template_var("lon", long_name = "hi") |>
125+
add_lon_dim(name = "lon", dim = [20.0, 30.0, 40.0, 360.0, 370.0]) |>
126+
add_data(data = [1.0, 2.0, 3.0, 4.0, 5.0]) |>
127+
initialize
117128

118129
var_40_400 = ClimaAnalysis.shift_longitude(var_20_380, 40.0, 400.0)
119130
@test var_40_400.dims["lon"] == [40.0, 360.0, 370.0, 380.0, 390.0]
120131
@test var_40_400.data == [3.0, 4.0, 5.0, 1.0, 2.0]
121132

122133
# Center longitudes with 3D OutputVar
123-
lat = [-90.0, -30.0, 30.0, 90.0]
124-
lon = [-60.0, -30.0, 0.0, 30.0, 60.0]
125-
time = [0.0, 1.0, 5.0]
126-
n_elts = length(lat) * length(lon) * length(time)
127-
dims = OrderedDict("lat" => lat, "lon" => lon, "time" => time)
128-
size_of_data = (length(lat), length(lon), length(time))
129-
data = reshape(collect(1.0:n_elts), size_of_data...)
130-
attribs = Dict("long_name" => "hi")
131-
dim_attribs = OrderedDict(
132-
"lat" => Dict("units" => "degrees"),
133-
"lon" => Dict("units" => "degrees"),
134-
"time" => Dict("units" => "seconds"),
135-
)
136-
var = ClimaAnalysis.OutputVar(attribs, dims, dim_attribs, data)
134+
var =
135+
make_template_var("lat", "lon", "time"; long_name = "hi") |>
136+
add_lat_dim(dim = [-90.0, -30.0, 30.0, 90.0]) |>
137+
add_lon_dim(name = "lon", dim = [-60.0, -30.0, 0.0, 30.0, 60.0]) |>
138+
add_time_dim(dim = [0.0, 1.0, 5.0]) |>
139+
ones_to_n_data(lazy = true) |>
140+
initialize
141+
data = copy(var.data)
137142

138143
var = ClimaAnalysis.shift_longitude(var, 0.0, 360.0)
139144
@test var.dims["lon"] == [0.0, 30.0, 60.0, 300.0, 330.0]
@@ -144,13 +149,22 @@ end
144149
end
145150

146151
@testset "Remake" begin
147-
lat = collect(range(-89.5, 89.5, 180))
148-
lon = collect(range(-179.5, 179.5, 360))
149-
data = ones(length(lat), length(lon))
150-
dims = OrderedDict(["lat" => lat, "lon" => lon])
151-
attribs = Dict("long_name" => "hi")
152-
dim_attribs = OrderedDict(["lat" => Dict("units" => "deg")])
153-
var = ClimaAnalysis.OutputVar(attribs, dims, dim_attribs, data)
152+
var =
153+
make_template_var("lat", "lon"; long_name = "hi") |>
154+
add_lat_dim(
155+
name = "lat",
156+
dim = collect(range(-89.5, 89.5, 180)),
157+
units = "deg",
158+
) |>
159+
add_lon_dim(
160+
name = "lon",
161+
dim = collect(range(-179.5, 179.5, 360)),
162+
units = "deg",
163+
) |>
164+
ones_data() |>
165+
initialize
166+
lon_length = length(ClimaAnalysis.longitudes(var))
167+
lat_length = length(ClimaAnalysis.latitudes(var))
154168

155169
remake_var = ClimaAnalysis.remake(var)
156170
remake_var.attributes["test"] = "test1"
@@ -165,10 +179,16 @@ end
165179
"lat" => collect(range(-89.5, 89.5, 180)),
166180
"lon" => collect(range(-179.5, 179.5, 360)),
167181
])
168-
@test var.dim_attributes == OrderedDict(["lat" => Dict("units" => "deg")])
169-
@test var.data == ones(length(lat), length(lon))
182+
@test var.dim_attributes == OrderedDict([
183+
"lat" => Dict("units" => "deg"),
184+
"lon" => Dict("units" => "deg"),
185+
])
186+
@test var.data == ones(lat_length, lon_length)
170187

171-
dims1 = OrderedDict(["lat1" => lat, "lon1" => lon])
188+
dims1 = OrderedDict([
189+
"lat1" => collect(range(-89.5, 89.5, 180)),
190+
"lon1" => collect(range(-179.5, 179.5, 360)),
191+
])
172192
dim_attribs1 = OrderedDict(["lat1" => Dict("units" => "deg")])
173193
remake_var2 =
174194
ClimaAnalysis.remake(var, dims = dims1, dim_attributes = dim_attribs1)
@@ -180,7 +200,7 @@ end
180200
])
181201
@test remake_var2.dim_attributes ==
182202
OrderedDict(["lat1" => Dict("units" => "deg")])
183-
@test remake_var2.data == ones(length(lat), length(lon))
203+
@test remake_var2.data == ones(lat_length, lon_length)
184204
end
185205

186206
@testset "Interpolant boundary conditions and error handling" begin
@@ -503,21 +523,16 @@ end
503523
end
504524

505525
@testset "Average over arbitrary dims" begin
506-
time = [0.0, 1.0, 2.0]
507-
lon = [0.0, 10.0, 20.0]
508-
lat = [0.0, 20.0, 40.0]
509-
data = collect(reshape(1.0:27.0, (3, 3, 3)))
510-
data[3, 3, 3] = NaN # replace 27
511-
data[2, 2, 2] = NaN # replace 14
512-
data[1, 1, 1] = NaN # replace 1
513-
dims = OrderedDict(["time" => time, "lon" => lon, "lat" => lat])
514-
attribs = Dict("long_name" => "hi")
515-
dim_attribs = OrderedDict([
516-
"time" => Dict("units" => "deg"),
517-
"lon" => Dict("units" => "deg"),
518-
"lat" => Dict("units" => "deg"),
519-
])
520-
var = ClimaAnalysis.OutputVar(attribs, dims, dim_attribs, data)
526+
var =
527+
make_template_var("time", "lon", "lat"; long_name = "hi") |>
528+
ones_to_n_data(lazy = false) |>
529+
add_time_dim(dim = [0.0, 1.0, 2.0]) |>
530+
add_lon_dim(name = "lon", dim = [0.0, 10.0, 20.0]) |>
531+
add_lat_dim(name = "lat", dim = [0.0, 20.0, 40.0]) |>
532+
initialize
533+
var.data[3, 3, 3] = NaN # replace 27
534+
var.data[2, 2, 2] = NaN # replace 14
535+
var.data[1, 1, 1] = NaN # replace 1
521536

522537
# ignore_nan = true, update_long_name = true
523538
avg_var = ClimaAnalysis.Var._average_dims(
@@ -528,7 +543,7 @@ end
528543
)
529544
@test avg_var.data[] (sum(i for i in 1:27) - 1.0 - 14.0 - 27.0) / 24.0
530545
@test avg_var.attributes["long_name"] ==
531-
"hi averaged over time (0.0 to 2.0deg), lon (0.0 to 20.0deg), and lat (0.0 to 40.0deg)"
546+
"hi averaged over time (0.0 to 2.0seconds), lon (0.0 to 20.0degrees_north), and lat (0.0 to 40.0degrees_east)"
532547

533548
# ignore_nan = false, update_long_name = true
534549
avg_var = ClimaAnalysis.Var._average_dims(
@@ -2475,16 +2490,12 @@ end
24752490

24762491
@testset "Land and ocean masks" begin
24772492
# Order of dimensions should not matter
2478-
lat = collect(range(-89.5, 89.5, 180))
2479-
lon = collect(range(-179.5, 179.5, 360))
2480-
data = ones(length(lat), length(lon))
2481-
dims = OrderedDict(["lat" => lat, "lon" => lon])
2482-
attribs = Dict("long_name" => "hi")
2483-
dim_attribs = OrderedDict([
2484-
"lat" => Dict("units" => "deg"),
2485-
"lon" => Dict("units" => "deg"),
2486-
])
2487-
var_latlon = ClimaAnalysis.OutputVar(attribs, dims, dim_attribs, data)
2493+
var_latlon =
2494+
make_template_var("lat", "lon"; long_name = "hi") |>
2495+
add_lat_dim(dim = collect(range(-89.5, 89.5, 180))) |>
2496+
add_lon_dim(dim = collect(range(-179.5, 179.5, 360))) |>
2497+
ones_data() |>
2498+
initialize
24882499

24892500
lon = collect(range(-179.5, 179.5, 360))
24902501
lat = collect(range(-89.5, 89.5, 180))
@@ -2650,47 +2661,42 @@ end
26502661
end
26512662

26522663
@testset "Replace" begin
2653-
times = collect(range(0.0, 100, 2 * 180))
2654-
data = ones(length(times))
2655-
data[1:5] .= NaN
2656-
dims = OrderedDict(["time" => times])
2657-
attribs = Dict("long_name" => "hi")
2658-
dim_attribs = OrderedDict(["time" => Dict("units" => "s")])
2659-
var = ClimaAnalysis.OutputVar(attribs, dims, dim_attribs, data)
2664+
var =
2665+
TemplateVar() |>
2666+
add_time_dim(dim = collect(range(0.0, 100, 2 * 180))) |>
2667+
ones_data() |>
2668+
add_attribs(long_name = "hi") |>
2669+
initialize
2670+
var.data[1:5] .= NaN
2671+
26602672
var_no_nan = ClimaAnalysis.replace(var, NaN => 0.0)
26612673
@test var_no_nan.dims == var.dims
26622674
@test var_no_nan.data == vcat(zeros(5), ones(355))
26632675
@test var_no_nan.attributes == var.attributes
26642676
@test var_no_nan.dim_attributes == var.dim_attributes
26652677

2666-
lat = collect(range(-89.5, 89.5, 180))
2667-
lon = collect(range(-179.5, 179.5, 360))
2668-
data = ones(length(lat), length(lon))
2669-
data[42:47] .= NaN
2670-
data[32042:32047] .= NaN
2671-
dims = OrderedDict(["lat" => lat, "lon" => lon])
2672-
attribs = Dict("long_name" => "hi")
2673-
dim_attribs = OrderedDict([
2674-
"lat" => Dict("units" => "deg"),
2675-
"lon" => Dict("units" => "deg"),
2676-
])
2677-
var = ClimaAnalysis.OutputVar(attribs, dims, dim_attribs, data)
2678+
var =
2679+
make_template_var("lat", "lon"; long_name = "hi") |>
2680+
ones_data() |>
2681+
add_lat_dim(dim = collect(range(-89.5, 89.5, 180))) |>
2682+
add_lon_dim(dim = collect(range(-179.5, 179.5, 360))) |>
2683+
initialize
2684+
var.data[42:47] .= NaN
2685+
var.data[32042:32047] .= NaN
2686+
26782687
var_no_nan = ClimaAnalysis.replace(var, NaN => 1.0)
26792688
@test var_no_nan.dims == var.dims
2680-
@test var_no_nan.data == ones(length(lat), length(lon))
2689+
@test var_no_nan.data == ones(size(var.data)...)
26812690
@test var_no_nan.attributes == var.attributes
26822691
@test var_no_nan.dim_attributes == var.dim_attributes
26832692

2684-
lat = collect(range(-89.5, 89.5, 2))
2685-
lon = collect(range(-179.5, 179.5, 2))
2686-
data = [[missing, NaN] [NaN, missing]]
2687-
dims = OrderedDict(["lat" => lat, "lon" => lon])
2688-
attribs = Dict("long_name" => "hi")
2689-
dim_attribs = OrderedDict([
2690-
"lat" => Dict("units" => "deg"),
2691-
"lon" => Dict("units" => "deg"),
2692-
])
2693-
var = ClimaAnalysis.OutputVar(attribs, dims, dim_attribs, data)
2693+
var =
2694+
make_template_var("lat", "lon"; long_name = "hi") |>
2695+
add_lat_dim(dim = collect(range(-89.5, 89.5, 2))) |>
2696+
add_lon_dim(dim = collect(range(-179.5, 179.5, 2))) |>
2697+
add_data(data = [[missing, NaN] [NaN, missing]]) |>
2698+
initialize
2699+
26942700
var_no_nan = ClimaAnalysis.replace(var, missing => 1.0, NaN => 2.0)
26952701
@test var_no_nan.dims == var.dims
26962702
@test var_no_nan.data == [[1.0, 2.0] [2.0, 1.0]]
@@ -2700,16 +2706,12 @@ end
27002706

27012707
@testset "Set units for dimension" begin
27022708
# Units exist in dim_attribs
2703-
lat = collect(range(-89.5, 89.5, 180))
2704-
lon = collect(range(-179.5, 179.5, 360))
2705-
data = ones(length(lat), length(lon))
2706-
dims = OrderedDict(["lat" => lat, "lon" => lon])
2707-
attribs = Dict("long_name" => "hi")
2708-
dim_attribs = OrderedDict([
2709-
"lat" => Dict("units" => "deg"),
2710-
"lon" => Dict("units" => "deg"),
2711-
])
2712-
var = ClimaAnalysis.OutputVar(attribs, dims, dim_attribs, data)
2709+
var =
2710+
make_template_var("lat", "lon") |>
2711+
add_lat_dim(name = "lat", units = "deg") |>
2712+
add_lon_dim(name = "lon", units = "deg") |>
2713+
ones_data() |>
2714+
initialize
27132715
ClimaAnalysis.set_dim_units!(var, "lat", "degrees")
27142716
@test ClimaAnalysis.dim_units(var, "lat") == "degrees"
27152717

@@ -2794,11 +2796,13 @@ end
27942796
lat = reverse(collect(range(-89.5, 89.5, 180)))
27952797
lon = collect(range(-179.5, 179.5, 360))
27962798
data = reshape(collect(1:(360 * 180)), (180, 360))
2797-
dims = OrderedDict(["lat" => lat, "lon" => lon])
2798-
attribs = Dict("long_name" => "hi")
2799-
dim_attribs = OrderedDict(["lon" => Dict("units" => "deg")])
2800-
var = ClimaAnalysis.OutputVar(attribs, dims, dim_attribs, data)
2801-
@test isnothing(ClimaAnalysis.Var._make_interpolant(dims, data))
2799+
var =
2800+
make_template_var("lat", "lon"; long_name = "hi") |>
2801+
add_lat_dim(name = "lat", dim = lat) |>
2802+
add_lon_dim(name = "lon", dim = lon, units = "deg") |>
2803+
add_data(data = data) |>
2804+
initialize
2805+
@test isnothing(ClimaAnalysis.Var._make_interpolant(var.dims, data))
28022806

28032807
# Test reverse_dim
28042808
reverse_var = ClimaAnalysis.reverse_dim(var, "lat")
@@ -2831,12 +2835,13 @@ end
28312835
@testset "Convert units of dimensions" begin
28322836
# Convert units of one dimension
28332837
lat = collect(range(-89.5, 89.5, 180))
2834-
lon = collect(range(-179.5, 179.5, 360))
2835-
data = ones(length(lat), length(lon))
2836-
dims = OrderedDict(["lat" => lat, "lon" => lon])
2837-
attribs = Dict("long_name" => "hi")
2838-
dim_attribs = OrderedDict(["lat" => Dict("units" => "deg")])
2839-
var = ClimaAnalysis.OutputVar(attribs, dims, dim_attribs, data)
2838+
var =
2839+
make_template_var("lat", "lon") |>
2840+
add_lat_dim(name = "lat", dim = lat) |>
2841+
ones_data() |>
2842+
initialize
2843+
var.dim_attributes["lon"] = Dict()
2844+
28402845
var_units = ClimaAnalysis.convert_dim_units(
28412846
var,
28422847
"lat",

0 commit comments

Comments
 (0)
Please sign in to comment.