@@ -8,6 +8,19 @@ import OrderedCollections: OrderedDict
8
8
import Unitful: @u_str
9
9
import Dates
10
10
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
+
11
24
@testset " General" begin
12
25
# Add test for short constructor
13
26
long = - 180.0 : 180.0 |> collect
@@ -87,12 +100,11 @@ import Dates
87
100
end
88
101
89
102
@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
96
108
97
109
# Shift longitudes from 0 to 360 degrees to -180 to 180 degrees
98
110
var_neg_180_180 = ClimaAnalysis. shift_longitude (var_0_360, - 180.0 , 180.0 )
@@ -108,32 +120,25 @@ end
108
120
@test var_0_360. data == collect (range (0.0 , 359.0 , 360 ))
109
121
110
122
# 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
117
128
118
129
var_40_400 = ClimaAnalysis. shift_longitude (var_20_380, 40.0 , 400.0 )
119
130
@test var_40_400. dims[" lon" ] == [40.0 , 360.0 , 370.0 , 380.0 , 390.0 ]
120
131
@test var_40_400. data == [3.0 , 4.0 , 5.0 , 1.0 , 2.0 ]
121
132
122
133
# 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)
137
142
138
143
var = ClimaAnalysis. shift_longitude (var, 0.0 , 360.0 )
139
144
@test var. dims[" lon" ] == [0.0 , 30.0 , 60.0 , 300.0 , 330.0 ]
@@ -144,13 +149,22 @@ end
144
149
end
145
150
146
151
@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))
154
168
155
169
remake_var = ClimaAnalysis. remake (var)
156
170
remake_var. attributes[" test" ] = " test1"
@@ -165,10 +179,16 @@ end
165
179
" lat" => collect (range (- 89.5 , 89.5 , 180 )),
166
180
" lon" => collect (range (- 179.5 , 179.5 , 360 )),
167
181
])
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)
170
187
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
+ ])
172
192
dim_attribs1 = OrderedDict ([" lat1" => Dict (" units" => " deg" )])
173
193
remake_var2 =
174
194
ClimaAnalysis. remake (var, dims = dims1, dim_attributes = dim_attribs1)
180
200
])
181
201
@test remake_var2. dim_attributes ==
182
202
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 )
184
204
end
185
205
186
206
@testset " Interpolant boundary conditions and error handling" begin
@@ -503,21 +523,16 @@ end
503
523
end
504
524
505
525
@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
521
536
522
537
# ignore_nan = true, update_long_name = true
523
538
avg_var = ClimaAnalysis. Var. _average_dims (
528
543
)
529
544
@test avg_var. data[] ≈ (sum (i for i in 1 : 27 ) - 1.0 - 14.0 - 27.0 ) / 24.0
530
545
@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 )"
532
547
533
548
# ignore_nan = false, update_long_name = true
534
549
avg_var = ClimaAnalysis. Var. _average_dims (
@@ -2475,16 +2490,12 @@ end
2475
2490
2476
2491
@testset " Land and ocean masks" begin
2477
2492
# 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
2488
2499
2489
2500
lon = collect (range (- 179.5 , 179.5 , 360 ))
2490
2501
lat = collect (range (- 89.5 , 89.5 , 180 ))
@@ -2650,47 +2661,42 @@ end
2650
2661
end
2651
2662
2652
2663
@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
+
2660
2672
var_no_nan = ClimaAnalysis. replace (var, NaN => 0.0 )
2661
2673
@test var_no_nan. dims == var. dims
2662
2674
@test var_no_nan. data == vcat (zeros (5 ), ones (355 ))
2663
2675
@test var_no_nan. attributes == var. attributes
2664
2676
@test var_no_nan. dim_attributes == var. dim_attributes
2665
2677
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
+
2678
2687
var_no_nan = ClimaAnalysis. replace (var, NaN => 1.0 )
2679
2688
@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) ... )
2681
2690
@test var_no_nan. attributes == var. attributes
2682
2691
@test var_no_nan. dim_attributes == var. dim_attributes
2683
2692
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
+
2694
2700
var_no_nan = ClimaAnalysis. replace (var, missing => 1.0 , NaN => 2.0 )
2695
2701
@test var_no_nan. dims == var. dims
2696
2702
@test var_no_nan. data == [[1.0 , 2.0 ] [2.0 , 1.0 ]]
@@ -2700,16 +2706,12 @@ end
2700
2706
2701
2707
@testset " Set units for dimension" begin
2702
2708
# 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
2713
2715
ClimaAnalysis. set_dim_units! (var, " lat" , " degrees" )
2714
2716
@test ClimaAnalysis. dim_units (var, " lat" ) == " degrees"
2715
2717
@@ -2794,11 +2796,13 @@ end
2794
2796
lat = reverse (collect (range (- 89.5 , 89.5 , 180 )))
2795
2797
lon = collect (range (- 179.5 , 179.5 , 360 ))
2796
2798
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))
2802
2806
2803
2807
# Test reverse_dim
2804
2808
reverse_var = ClimaAnalysis. reverse_dim (var, " lat" )
@@ -2831,12 +2835,13 @@ end
2831
2835
@testset " Convert units of dimensions" begin
2832
2836
# Convert units of one dimension
2833
2837
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
+
2840
2845
var_units = ClimaAnalysis. convert_dim_units (
2841
2846
var,
2842
2847
" lat" ,
0 commit comments