From 1f37d2436a0878390b27edbcc04baca6215c8dbe Mon Sep 17 00:00:00 2001 From: Milan Date: Mon, 13 May 2024 18:46:20 -0400 Subject: [PATCH 1/3] Bitrounding + Lossless compression --- src/OutputWriters/bit_rounding.jl | 52 +++++++ src/OutputWriters/fetch_output.jl | 12 +- src/OutputWriters/jld2_output_writer.jl | 22 ++- src/OutputWriters/netcdf_output_writer.jl | 168 ++++++---------------- 4 files changed, 127 insertions(+), 127 deletions(-) create mode 100644 src/OutputWriters/bit_rounding.jl diff --git a/src/OutputWriters/bit_rounding.jl b/src/OutputWriters/bit_rounding.jl new file mode 100644 index 0000000000..6146db9123 --- /dev/null +++ b/src/OutputWriters/bit_rounding.jl @@ -0,0 +1,52 @@ +using BitInformation + +struct BitRounding{K} + keepbits :: K +end + +# number of keepbits (mantissa bits) for each variable +default_bit_rounding(::Val{name}) where name = 23 # single precision default +default_bit_rounding(::Val{:u}) = 2 +default_bit_rounding(::Val{:v}) = 2 +default_bit_rounding(::Val{:w}) = 2 +default_bit_rounding(::Val{:T}) = 7 +default_bit_rounding(::Val{:S}) = 16 # 12 at the surface, 16 deep ocean +default_bit_rounding(::Val{:η}) = 6 + +function BitRounding(outputs = nothing; + user_rounding...) + + keepbits = Dict() + + # TODO: + # Check that the dimensions of keepbits are + # compatible with outputs if user_rounding + # contains an abstract array (support functions?) + + for name in keys(outputs) + if name ∈ keys(user_rounding) + keepbits[name] = user_rounding[name] + else + keepbits[name] = default_bit_rounding(Val(name)) + end + end + + return BitRounding(keepbits) +end + +# Getindex to allow indexing a BitRounder as +Base.getindex(bit_rounding::BitRounding, name::Symbol) = BitRounding(bit_rounding[name]) + +function round_data!(output_array, bit_rounder::BitRounder) + + # The actual rounding... + keepbits = bit_rounder.keepbits + + # TODO: make sure that the rounding happens + # as we expect (priority to the vertical direction!) + round!(output_array, keepbits) + + return output_array +end + + \ No newline at end of file diff --git a/src/OutputWriters/fetch_output.jl b/src/OutputWriters/fetch_output.jl index 99de6cc505..471a3f2c8b 100644 --- a/src/OutputWriters/fetch_output.jl +++ b/src/OutputWriters/fetch_output.jl @@ -25,9 +25,9 @@ function fetch_output(lagrangian_particles::LagrangianParticles, model) return NamedTuple{names}([getproperty(particle_properties, name) for name in names]) end -convert_output(output, writer) = output +convert_output(output, writer, bit_rounder) = output -function convert_output(output::AbstractArray, writer) +function convert_output(output::AbstractArray, writer, bit_rounder) if architecture(output) isa GPU output_array = writer.array_type(undef, size(output)...) copyto!(output_array, output) @@ -35,12 +35,18 @@ function convert_output(output::AbstractArray, writer) output_array = convert(writer.array_type, output) end + # always happens on the CPU + round_data!(output_array, bit_rounder) + return output_array end +# Fallback for a `Nothing` bit_rounder (no rounding) +round_data!(output_array, bit_rounder) = nothing + # Need to broadcast manually because of https://github.com/JuliaLang/julia/issues/30836 convert_output(outputs::NamedTuple, writer) = - NamedTuple(name => convert_output(outputs[name], writer) for name in keys(outputs)) + NamedTuple(name => convert_output(outputs[name], writer, writer.bit_rounder[name]) for name in keys(outputs)) function fetch_and_convert_output(output, model, writer) fetched = fetch_output(output, model) diff --git a/src/OutputWriters/jld2_output_writer.jl b/src/OutputWriters/jld2_output_writer.jl index b97ccbf2b4..12d68f5def 100644 --- a/src/OutputWriters/jld2_output_writer.jl +++ b/src/OutputWriters/jld2_output_writer.jl @@ -9,7 +9,11 @@ default_included_properties(::NonhydrostaticModel) = [:grid, :coriolis, :buoyanc default_included_properties(::ShallowWaterModel) = [:grid, :coriolis, :closure] default_included_properties(::HydrostaticFreeSurfaceModel) = [:grid, :coriolis, :buoyancy, :closure] -mutable struct JLD2OutputWriter{O, T, D, IF, IN, FS, KW} <: AbstractOutputWriter +# currently uses CodecZlib, ZlibCompressor as default +# TODO: update to ZstdCompressor with https://github.com/JuliaIO/JLD2.jl/pull/560 merged +default_jld2_kwargs() = (; compress=true) + +mutable struct JLD2OutputWriter{O, T, D, IF, IN, BR, FS, KW} <: AbstractOutputWriter filepath :: String outputs :: O schedule :: T @@ -17,6 +21,7 @@ mutable struct JLD2OutputWriter{O, T, D, IF, IN, FS, KW} <: AbstractOutputWriter init :: IF including :: IN part :: Int + bit_rounder :: BR file_splitting :: FS overwrite_existing :: Bool verbose :: Bool @@ -33,6 +38,7 @@ ext(::Type{JLD2OutputWriter}) = ".jld2" with_halos = false, array_type = Array{Float64}, file_splitting = NoFileSplitting(), + bit_rounder = nothing, overwrite_existing = false, init = noinit, including = [:grid, :coriolis, :buoyancy, :closure], @@ -97,6 +103,10 @@ Keyword arguments - `including`: List of model properties to save with every file. Default: `[:grid, :coriolis, :buoyancy, :closure]` +## Compressing the output + +- `bit_rounder`: Number of keepbits per variable and vertical level, applies bitrounding + ## Miscellaneous keywords - `verbose`: Log what the output writer is doing with statistics on compute/write times and file sizes. @@ -170,10 +180,11 @@ function JLD2OutputWriter(model, outputs; filename, schedule, file_splitting = NoFileSplitting(), overwrite_existing = false, init = noinit, + bit_rounder = nothing, including = default_included_properties(model), verbose = false, part = 1, - jld2_kw = Dict{Symbol, Any}()) + jld2_kw = default_jld2_kwargs()) mkpath(dir) filename = auto_extension(filename, ".jld2") @@ -184,12 +195,17 @@ function JLD2OutputWriter(model, outputs; filename, schedule, outputs = NamedTuple(Symbol(name) => construct_output(outputs[name], model.grid, indices, with_halos) for name in keys(outputs)) + # No rounding for any variable! + if isnothing(bit_rounder) + bit_rounder = Dict{Symbol, Any}(Symbol(name) => nothing for name in keys(outputs)) + end + # Convert each output to WindowedTimeAverage if schedule::AveragedTimeWindow is specified schedule, outputs = time_average_outputs(schedule, outputs, model) initialize_jld2_file!(filepath, init, jld2_kw, including, outputs, model) - return JLD2OutputWriter(filepath, outputs, schedule, array_type, init, + return JLD2OutputWriter(filepath, outputs, schedule, array_type, init, bit_rounder, including, part, file_splitting, overwrite_existing, verbose, jld2_kw) end diff --git a/src/OutputWriters/netcdf_output_writer.jl b/src/OutputWriters/netcdf_output_writer.jl index 56d328296b..fda4c3bc43 100644 --- a/src/OutputWriters/netcdf_output_writer.jl +++ b/src/OutputWriters/netcdf_output_writer.jl @@ -10,8 +10,7 @@ using Oceananigans.Utils: versioninfo_with_gpu, oceananigans_versioninfo, pretty using Oceananigans.TimeSteppers: float_or_date_time using Oceananigans.Fields: reduced_dimensions, reduced_location, location, validate_indices -mutable struct NetCDFOutputWriter{G, D, O, T, A, FS} <: AbstractOutputWriter - grid :: G +mutable struct NetCDFOutputWriter{D, O, T, A, BR, FS} <: AbstractOutputWriter filepath :: String dataset :: D outputs :: O @@ -23,6 +22,7 @@ mutable struct NetCDFOutputWriter{G, D, O, T, A, FS} <: AbstractOutputWriter output_attributes :: Dict dimensions :: Dict overwrite_existing :: Bool + bit_rounding :: BR deflatelevel :: Int part :: Int file_splitting :: FS @@ -163,35 +163,29 @@ function add_schedule_metadata!(global_attributes, schedule::AveragedTimeInterva end """ - NetCDFOutputWriter(model, outputs; filename, schedule, - grid = model.grid, - dir = ".", - array_type = Array{Float64}, - indices = nothing, - with_halos = false, - global_attributes = Dict(), - output_attributes = Dict(), - dimensions = Dict(), - overwrite_existing = false, - deflatelevel = 0, - part = 1, - file_splitting = NoFileSplitting(), - verbose = false) + NetCDFOutputWriter(model, outputs; filename, schedule + dir = ".", + array_type = Array{Float64}, + indices = nothing, + with_halos = false, + global_attributes = Dict(), + output_attributes = Dict(), + dimensions = Dict(), + overwrite_existing = false, + deflatelevel = 0, + part = 1, + file_splitting = NoFileSplitting(), + verbose = false) Construct a `NetCDFOutputWriter` that writes `(label, output)` pairs in `outputs` (which should be a `Dict`) to a NetCDF file, where `label` is a string that labels the output and `output` is either a `Field` (e.g. `model.velocities.u`) or a function `f(model)` that -returns something to be written to disk. - -If any of `outputs` are not `AbstractField`, their spatial `dimensions` must be provided. - -To use `outputs` on a `grid` not equal to `model.grid`, provide the keyword argument `grid.` +returns something to be written to disk. Custom output requires the spatial `dimensions` (a +`Dict`) to be manually specified (see examples). Keyword arguments ================= -- `grid`: The grid associated with `outputs`. Defaults to `model.grid`. - ## Filenaming - `filename` (required): Descriptive filename. `".nc"` is appended to `filename` if `filename` does @@ -326,7 +320,7 @@ simulation = Simulation(model, Δt=1.25, stop_iteration=3) f(model) = model.clock.time^2; # scalar output -g(model) = model.clock.time .* exp.(znodes(grid, Center())) # vector/profile output +g(model) = model.clock.time .* exp.(znodes(Center, grid)) # vector/profile output xC, yF = xnodes(grid, Center()), ynodes(grid, Face()) @@ -361,55 +355,20 @@ NetCDFOutputWriter scheduled on IterationInterval(1): ├── file_splitting: NoFileSplitting └── file size: 17.8 KiB ``` - -`NetCDFOutputWriter` can also be configured for `outputs` that are interpolated or regridded -to a different grid than `model.grid`. To use this functionality, include the keyword argument -`grid = output_grid`. - -```jldoctest -using Oceananigans -using Oceananigans.Fields: interpolate! - -grid = RectilinearGrid(size=(1, 1, 8), extent=(1, 1, 1)); -model = NonhydrostaticModel(; grid) - -coarse_grid = RectilinearGrid(size=(grid.Nx, grid.Ny, grid.Nz÷2), extent=(grid.Lx, grid.Ly, grid.Lz)) -coarse_u = Field{Face, Center, Center}(coarse_grid) - -interpolate_u(model) = interpolate!(coarse_u, model.velocities.u) -outputs = (; u = interpolate_u) - -output_writer = NetCDFOutputWriter(model, outputs; - grid = coarse_grid, - filename = "coarse_u.nc", - schedule = IterationInterval(1)) - -# output -NetCDFOutputWriter scheduled on IterationInterval(1): -├── filepath: ./coarse_u.nc -├── dimensions: zC(4), zF(5), xC(1), yF(1), xF(1), yC(1), time(0) -├── 1 outputs: u -└── array type: Array{Float64} -├── file_splitting: NoFileSplitting -└── file size: 14.5 KiB -``` """ -function NetCDFOutputWriter(model, outputs; - filename, - schedule, - grid = model.grid, - dir = ".", - array_type = Array{Float64}, - indices = (:, :, :), - with_halos = false, +function NetCDFOutputWriter(model, outputs; filename, schedule, + dir = ".", + array_type = Array{Float64}, + indices = (:, :, :), + with_halos = false, global_attributes = Dict(), output_attributes = Dict(), - dimensions = Dict(), - overwrite_existing = nothing, - deflatelevel = 0, - part = 1, - file_splitting = NoFileSplitting(), - verbose = false) + dimensions = Dict(), + overwrite_existing = nothing, + deflatelevel = 0, + part = 1, + file_splitting = NoFileSplitting(), + verbose = false) mkpath(dir) filename = auto_extension(filename, ".nc") filepath = joinpath(dir, filename) @@ -436,7 +395,7 @@ function NetCDFOutputWriter(model, outputs; # with LagrangianParticles output (see the end of the file). # We shouldn't support this in the future; we should require users to 'name' LagrangianParticles output. outputs = dictify(outputs) - outputs = Dict(string(name) => construct_output(outputs[name], grid, indices, with_halos) for name in keys(outputs)) + outputs = Dict(string(name) => construct_output(outputs[name], model.grid, indices, with_halos) for name in keys(outputs)) output_attributes = dictify(output_attributes) global_attributes = dictify(global_attributes) @@ -456,11 +415,9 @@ function NetCDFOutputWriter(model, outputs; dimensions, overwrite_existing, deflatelevel, - grid, model) - return NetCDFOutputWriter(grid, - filepath, + return NetCDFOutputWriter(filepath, dataset, outputs, schedule, @@ -490,44 +447,28 @@ get_default_dimension_attributes(grid::ImmersedBoundaryGrid) = ##### Variable definition ##### -materialize_output(func, model) = func(model) -materialize_output(field::AbstractField, model) = field -materialize_output(particles::LagrangianParticles, model) = particles -materialize_output(output::WindowedTimeAverage{<:AbstractField}, model) = output - """ Defines empty variables for 'custom' user-supplied `output`. """ -function define_output_variable!(dataset, output, name, array_type, - deflatelevel, attrib, dimensions, filepath) +function define_output_variable!(dataset, output, name, array_type, deflatelevel, output_attributes, dimensions) + name ∉ keys(dimensions) && error("Custom output $name needs dimensions!") - if name ∉ keys(dimensions) - msg = string("dimensions[$name] for output $name=", typeof(output), " into ", filepath, '\n', - " must be provided when constructing NetCDFOutputWriter") - throw(ArgumentError(msg)) - end - - dims = dimensions[name] - FT = eltype(array_type) - defVar(dataset, name, FT, (dims..., "time"); deflatelevel, attrib) + defVar(dataset, name, eltype(array_type), (dimensions[name]..., "time"), + deflatelevel=deflatelevel, attrib=output_attributes) return nothing end """ Defines empty field variable. """ -function define_output_variable!(dataset, output::AbstractField, name, array_type, - deflatelevel, attrib, dimensions, filepath) - - dims = netcdf_spatial_dimensions(output) - FT = eltype(array_type) - defVar(dataset, name, FT, (dims..., "time"); deflatelevel, attrib) - - return nothing -end +define_output_variable!(dataset, output::AbstractField, name, array_type, deflatelevel, output_attributes, dimensions) = + defVar(dataset, name, eltype(array_type), + (netcdf_spatial_dimensions(output)..., "time"), + deflatelevel=deflatelevel, attrib=output_attributes) """ Defines empty field variable for `WindowedTimeAverage`s over fields. """ define_output_variable!(dataset, output::WindowedTimeAverage{<:AbstractField}, args...) = define_output_variable!(dataset, output.operand, args...) + ##### ##### Write output ##### @@ -640,17 +581,12 @@ end ##### """ Defines empty variable for particle trackting. """ -function define_output_variable!(dataset, output::LagrangianParticles, name, array_type, - deflatelevel, output_attributes, dimensions, filepath) - +function define_output_variable!(dataset, output::LagrangianParticles, name, array_type, deflatelevel, output_attributes, dimensions) particle_fields = eltype(output.properties) |> fieldnames .|> string - T = eltype(array_type) - for particle_field in particle_fields - defVar(dataset, particle_field, T, ("particle_id", "time"); deflatelevel) + defVar(dataset, particle_field, eltype(array_type), + ("particle_id", "time"), deflatelevel=deflatelevel) end - - return nothing end dictify(outputs::LagrangianParticles) = Dict("particles" => outputs) @@ -698,7 +634,6 @@ function initialize_nc_file!(filepath, dimensions, overwrite_existing, deflatelevel, - grid, model) mode = overwrite_existing ? "c" : "a" @@ -714,12 +649,12 @@ function initialize_nc_file!(filepath, # schedule::AveragedTimeInterval schedule, outputs = time_average_outputs(schedule, outputs, model) - dims = default_dimensions(outputs, grid, indices, with_halos) + dims = default_dimensions(outputs, model.grid, indices, with_halos) # Open the NetCDF dataset file dataset = NCDataset(filepath, mode, attrib=global_attributes) - default_dimension_attributes = get_default_dimension_attributes(grid) + default_dimension_attributes = get_default_dimension_attributes(model.grid) # Define variables for each dimension and attributes if this is a new file. if mode == "c" @@ -735,7 +670,7 @@ function initialize_nc_file!(filepath, # Creates an unlimited dimension "time" defDim(dataset, "time", Inf) - defVar(dataset, "time", eltype(grid), ("time",), attrib=time_attrib) + defVar(dataset, "time", eltype(model.grid), ("time",), attrib=time_attrib) # Use default output attributes for known outputs if the user has not specified any. # Unknown outputs get an empty tuple (no output attributes). @@ -747,15 +682,7 @@ function initialize_nc_file!(filepath, for (name, output) in outputs attributes = try output_attributes[name]; catch; Dict(); end - materialized = materialize_output(output, model) - define_output_variable!(dataset, - materialized, - name, - array_type, - deflatelevel, - attributes, - dimensions, - filepath) # for better error messages + define_output_variable!(dataset, output, name, array_type, deflatelevel, attributes, dimensions) end sync(dataset) @@ -778,5 +705,4 @@ initialize_nc_file!(ow::NetCDFOutputWriter, model) = ow.dimensions, ow.overwrite_existing, ow.deflatelevel, - ow.grid, model) From 7416b7be6e5142b9d55ffcde560699c36d0d2733 Mon Sep 17 00:00:00 2001 From: Milan Date: Mon, 13 May 2024 19:45:28 -0400 Subject: [PATCH 2/3] add BitInformation to Project.toml --- Manifest.toml | 114 ++++++++++++++++++++++++++++++++++++++++++++++++-- Project.toml | 6 +-- 2 files changed, 114 insertions(+), 6 deletions(-) diff --git a/Manifest.toml b/Manifest.toml index d5436d0468..c323823e61 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -1,8 +1,8 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.10.2" +julia_version = "1.10.3" manifest_format = "2.0" -project_hash = "04d395caf937b0921325a77873167e8baa293a99" +project_hash = "1a55c09e5d4044471f86f0afdb97b4eddb2f43cf" [[deps.AbstractFFTs]] deps = ["LinearAlgebra"] @@ -28,6 +28,12 @@ weakdeps = ["StaticArrays"] [deps.Adapt.extensions] AdaptStaticArraysExt = "StaticArrays" +[[deps.AliasTables]] +deps = ["Random"] +git-tree-sha1 = "82b912bb5215792fd33df26f407d064d3602af98" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.2" + [[deps.ArgTools]] uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" version = "1.1.1" @@ -78,6 +84,12 @@ version = "0.5.0" [[deps.Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +[[deps.BitInformation]] +deps = ["Distributions", "Random", "StatsBase"] +git-tree-sha1 = "8f98d9d01f50d3a9bf987d7e206c993b390a98bf" +uuid = "de688a37-743e-4ac2-a6f0-bd62414d1aa7" +version = "0.6.1" + [[deps.Blosc_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"] git-tree-sha1 = "19b98ee7e3db3b4eff74c5c9c72bf32144e24f10" @@ -133,6 +145,12 @@ git-tree-sha1 = "4ca7d6d92075906c2ce871ea8bba971fff20d00c" uuid = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" version = "0.12.1+0" +[[deps.Calculus]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" +uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" +version = "0.5.1" + [[deps.ColorTypes]] deps = ["FixedPointNumbers", "Random"] git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" @@ -164,7 +182,7 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.1.0+0" +version = "1.1.1+0" [[deps.ConstructionBase]] deps = ["LinearAlgebra"] @@ -241,6 +259,22 @@ version = "0.10.11" deps = ["Random", "Serialization", "Sockets"] uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "22c595ca4146c07b16bcf9c8bea86f731f7109d2" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.108" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + [[deps.DocStringExtensions]] deps = ["LibGit2"] git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" @@ -252,6 +286,12 @@ deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" version = "1.6.0" +[[deps.DualNumbers]] +deps = ["Calculus", "NaNMath", "SpecialFunctions"] +git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566" +uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74" +version = "0.6.8" + [[deps.Elliptic]] git-tree-sha1 = "71c79e77221ab3a29918aaf6db4f217b89138608" uuid = "b305315f-e792-5b7a-8f41-49f472929428" @@ -283,6 +323,18 @@ version = "1.16.3" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "0653c0a2396a6da5bc4766c43041ef5fd3efbe57" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.11.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + [[deps.FixedPointNumbers]] deps = ["Statistics"] git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" @@ -339,6 +391,12 @@ git-tree-sha1 = "ca0f6bf568b4bfc807e7537f081c81e35ceca114" uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" version = "2.10.0+0" +[[deps.HypergeometricFunctions]] +deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "f218fe3736ddf977e0e772bc9a586b2383da2685" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.23" + [[deps.IfElse]] git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" @@ -620,6 +678,12 @@ git-tree-sha1 = "ce3269ed42816bf18d500c9f63418d4b0d9f5a3b" uuid = "e98f9f5b-d649-5603-91fd-7774390e6439" version = "3.1.0+2" +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + [[deps.NetCDF_jll]] deps = ["Artifacts", "Blosc_jll", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "OpenMPI_jll", "XML2_jll", "Zlib_jll", "Zstd_jll", "libzip_jll"] git-tree-sha1 = "a8af1798e4eb9ff768ce7fdefc0e957097793f15" @@ -684,6 +748,12 @@ git-tree-sha1 = "2cd396108e178f3ae8dedbd8e938a18726ab2fbf" uuid = "c2071276-7c44-58a7-b746-946036e04d0a" version = "0.24.1+0" +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.31" + [[deps.PackageExtensionCompat]] git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518" uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930" @@ -761,6 +831,12 @@ git-tree-sha1 = "b437cdb0385ed38312d91d9c00c20f3798b30256" uuid = "49802e3a-d2f1-5c88-81d8-b72133a6f568" version = "1.5.1" +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "9b23c31e76e333e6fb4c1595ae6afa74966a729e" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.9.4" + [[deps.Quaternions]] deps = ["LinearAlgebra", "Random", "RealDot"] git-tree-sha1 = "994cc27cdacca10e68feb291673ec3a76aa2fae9" @@ -810,6 +886,18 @@ git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" uuid = "ae029012-a4dd-5104-9daa-d747884805df" version = "1.3.0" +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "f65dcb5fa46aee0cf9ed6274ccbd597adc49aa7b" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.7.1" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "6ed52fdd3382cf21947b15e8870ac0ddbff736da" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.4.0+0" + [[deps.Rotations]] deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"] git-tree-sha1 = "2a0a5d8569f481ff8840e3b7c84bbf188db6a3fe" @@ -922,6 +1010,26 @@ git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" version = "1.7.0" +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.3" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "cef0472124fab0695b58ca35a77c6fb942fdab8a" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.3.1" + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + + [deps.StatsFuns.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + [[deps.Strided]] deps = ["LinearAlgebra", "StridedViews", "TupleTools"] git-tree-sha1 = "40c69be0e1b72ee2f42923b7d1ff13e0b04e675c" diff --git a/Project.toml b/Project.toml index 552bfcb4b8..2aaf6e839b 100644 --- a/Project.toml +++ b/Project.toml @@ -5,6 +5,7 @@ version = "0.91.0" [deps] Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +BitInformation = "de688a37-743e-4ac2-a6f0-bd62414d1aa7" CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" Crayons = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" CubedSphere = "7445602f-e544-4518-8976-18f8e8ae6cdb" @@ -43,6 +44,7 @@ OceananigansEnzymeExt = "Enzyme" [compat] Adapt = "3, 4" +BitInformation = "0.6" CUDA = "4.1.1, 5" Crayons = "4" CubedSphere = "0.1, 0.2" @@ -90,6 +92,4 @@ TimerOutputs = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" TimesDates = "bdfc003b-8df8-5c39-adcd-3a9087f5df4a" [targets] -test = ["BenchmarkTools", "Coverage", "CUDA_Runtime_jll", "DataDeps", "Enzyme", - "InteractiveUtils", "MPIPreferences", "OpenMPI_jll", "Test", "TimerOutputs", - "TimesDates", "SafeTestsets"] +test = ["BenchmarkTools", "Coverage", "CUDA_Runtime_jll", "DataDeps", "Enzyme", "InteractiveUtils", "MPIPreferences", "OpenMPI_jll", "Test", "TimerOutputs", "TimesDates", "SafeTestsets"] From a2c8793f0fb7957a29aacd489fb0965cd2026b57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milan=20Kl=C3=B6wer?= Date: Tue, 14 May 2024 14:12:58 -0400 Subject: [PATCH 3/3] Update src/OutputWriters/bit_rounding.jl Co-authored-by: Gregory L. Wagner --- src/OutputWriters/bit_rounding.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OutputWriters/bit_rounding.jl b/src/OutputWriters/bit_rounding.jl index 6146db9123..cef976aec2 100644 --- a/src/OutputWriters/bit_rounding.jl +++ b/src/OutputWriters/bit_rounding.jl @@ -1,6 +1,6 @@ using BitInformation -struct BitRounding{K} +struct BitRounder{K} keepbits :: K end