From c8e821072226105ee8c621af4dd21a7ba390f408 Mon Sep 17 00:00:00 2001 From: Kevin Phan <98072684+ph-kev@users.noreply.github.com> Date: Thu, 23 Jan 2025 17:22:47 -0800 Subject: [PATCH] Add check for whether P(z) is bijective or not --- src/Atmos.jl | 9 ++++++++- test/test_Atmos.jl | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Atmos.jl b/src/Atmos.jl index 65c4e70d..99043f7b 100644 --- a/src/Atmos.jl +++ b/src/Atmos.jl @@ -22,11 +22,18 @@ Linearly interpolate `var1d` from `origin_pressure` to `target_pressure`. Note: Values outside of the range are linearly extrapolated """ function _resample_column!(dest, var1d, origin_pressure, target_pressure) + Main.@infiltrate + reverse_origin_pressure = reverse(origin_pressure) + isunique = + length(unique(reverse_origin_pressure)) == + length(reverse_origin_pressure) + !(isunique && issorted(reverse_origin_pressure)) && + error("P(z) is not bijective, cannot resample column") # Interpolations.jl require increasing knots, but pressure is decreasing, so # we have to reverse it var1d_of_P = Intp.extrapolate( Intp.interpolate( - (reverse(origin_pressure),), + (reverse_origin_pressure,), reverse(var1d), Intp.Gridded(Intp.Linear()), ), diff --git a/test/test_Atmos.jl b/test/test_Atmos.jl index ed0fb91a..4204c231 100644 --- a/test/test_Atmos.jl +++ b/test/test_Atmos.jl @@ -181,6 +181,30 @@ import OrderedCollections: OrderedDict Zvar, Zvar, ) + + # P(z) is not bijective (not sorted) + pressure_var = ClimaAnalysis.OutputVar( + attribs, + Dict("z" => z_alt), + dim_attribs, + reverse(pdata), + ) + @test_throws ErrorException ClimaAnalysis.Atmos.to_pressure_coordinates( + pressure_var, + pressure_var, + ) + pressure = 300.0:-2.0:100.0 |> collect + pressure[2] = 300.0 + pressure_var = ClimaAnalysis.OutputVar( + attribs, + Dict("z" => z_alt), + dim_attribs, + pressure, + ) + @test_throws ErrorException ClimaAnalysis.Atmos.to_pressure_coordinates( + pressure_var, + pressure_var, + ) end @testset "RMSE of pressure coordinates" begin