- We've added new convenience constructors for spaces PR 2082. Here are links to the new constructors:
- Fixed writing/reading purely vertical spaces. PR 2102
- Fixed correctness bug in reductions on GPUs. PR 2106
-
We've added new convenience constructors for grids PR 1848. Here are links to the new constructors:
-
A
strict = true
keyword was added torcompare
, which checks that the types match. Ifstrict = false
, thenrcompare
will returntrue
forFieldVector
s andNamedTuple
s with the same properties but permuted order. For example:rcompare((;a=1,b=2), (;b=2,a=1); strict = true)
will returnfalse
andrcompare((;a=1,b=2), (;b=2,a=1); strict = false)
will returntrue
-
We've added new datalayouts:
VIJHF
,IJHF
,IHF
,VIHF
, to explore their performance compared to our existing datalayouts:VIJFH
,IJFH
,IFH
,VIFH
. PR #2055, PR #2052. -
We've refactored some modules to use less internals. PR #2053, PR #2052, #2051, #2049.
-
Some work was done in attempt to reduce specializations and compile time. PR #2042, #2041
ClimaCore
had incorrect lower bounds for certain packages. PR
#2078 fixes the lower bounds
and adds a GitHub Action workflow to test it. ClimaCore
now requires Julia
1.10 or greater.
- Fixed world-age issue on Julia 1.11 issue Julia#54780, PR #2034.
PR #2034 fixes some undefined
behavior in the DataLayout
module. This bug was manifesting itself as a world age
error in some applications that are using Julia 1.11.
PR #2033 introduces new
constructors for DataLayout
s. Instead of writing
array = rand(FT, Nv, Nij, Nij, 3, Nh)
data = VIJFH{S, Nv, Nij}(array)
You can now write
data = VIJFH{S}(ArrayType{FT}, rand; Nv, Nij, Nh)
and grab the array
with parent(data)
(if you need).
Note: These constructors are meant to be used in tests and interactive use, not in performance sensitive modules (due to their lack of inferrability).
- Fixed multiple-field solve for land simulations PR #2025.
- Fixed Julia 1.11 PR #2018.
Nh
was turned back into a dynamic parameter, in order to alleviate compile times PR #2005.- Defined some convenience methods #2012
Due to a bug, ==
was not recursively checking FieldVector
s with different
types, which resulted in false positives. This is now fixed and FieldVector
s
with different types are always considered different.
Prior to this change, the ClimaCore.InputOutput
module did not save whether a
Space
was constructed with deep = true
. This meant that restarting a
simulation from a HDF5 file led to inconsistent and incorrect spaces and
Field
s. This affected only extruded 3D spectral spaces.
We now expect Space
s read from a file to be bitwise identical to the original
one.
PR #2021.
- Fixed some type instabilities PR #2004
- More fixes to higher resolution column cases for the GPU #1854
-
Extended
create_dss_buffer
andweighted_dss!
forFieldVector
s, rather than justField
s. PR #2000. -
Fix restarting simulations from
Space
s withenable_bubble = true
Prior to this change, the ClimaCore.InputOutput
module did not save whether a
Space
was constructed with enable_bubble = true
. This meant that restarting
a simulation from a HDF5 file led to inconsistent and incorrect spaces and
Field
s. This affected only 2D spectral spaces (and extruded ones that have
this type of horizontal space).
We now expect Space
s read from a file to be bitwise identical to the original
one.
PR #1999.
- Added support for mixing extruded and horizontal spaces in GPU kernels. PR #1987.
- Inference was fixed for some broadcast expressions involving columns PR #1984.
-
CUDA kernel launch configurations have been tuned to improve performance, and now allows for high resolution in the vertical direction PR #1969, issue #1854 closed.
-
DSS was refactored, and machine precision changes can be expected. PR #1958.
- Added hyperbolic tangent stretching. PR #1930.
- Support for matrix fields on spectral and point spaces was added, PR #1884.
- Support for 3-component DSS transform was added, PR #1693.
- Support for column-wise "accumulate"/"reduce" operations were added, PR #1903. These abstractions will allow us to group, paralellize and optimize more column-wise work on the GPU.
- A new macro,
Fields.@rprint_diff
was added, which recursively print differences between twoFieldVector
s (of the same type) (PR #1886). - Julia 1.11 fixes (PR #1883)
Nh
has been added to the type parameter space, which allows us to more flexibly write performant backend kernels (PR #1894). This was leveraged in PR #1898, and may result in slightly more performant kernels.
- Various performance tweaks (PRs #1840, #1837, #1843, #1839).
- CPU/GPU kernels are now determined by dispatching, instead of specializing, which should (hopefully) have generally fixed GPU dispatching issues (PR #1863).
- Matrix multiplication kernels have been improved (PR #1880).
- Support for the following methods have been deprecated (PR #1821, ):
IntervalTopology(::Mesh)
in favor of usingIntervalTopology(::ClimaComms.AbstractDevice, ::Mesh)
FaceFiniteDifferenceSpace(::Mesh)
in favor of usingFaceFiniteDifferenceSpace(::ClimaComms.AbstractDevice, ::Mesh)
CenterFiniteDifferenceSpace(::Mesh)
in favor of usingCenterFiniteDifferenceSpace(::ClimaComms.AbstractDevice, ::Mesh)
FiniteDifferenceGrid(::Mesh)
in favor of usingFiniteDifferenceGrid(::ClimaComms.AbstractDevice, ::Mesh)
- GPU dispatching with
copyto!
andfill!
have been fixed PR #1802.
- Added
FieldMatrixWithSolver
, a wrapper that helps defining implicit Jacobians. PR #1788
-
Added
array2field(::Field)
andfield2array(::Field)
convenience functions, to help facilitate use with RRTMGP. PR #1768 -
Nv
is now a type parameter in DataLayouts that have vertical levels. As a result, users can useDataLayouts.nlevels(::AbstractData)
to obtain a compile-time constant for the number of vertical levels. -
Added
interpolate(field, target_hcoords, target_zcoord)
convenience function so that theRemapper
does not have to be explicitely constructed. PR #1764
-
run_field_matrix_solver!
was fixed for column spaces, and tests were added to ensure it doesn't break in the future. PR #1750 - We're now using local memory (MArrays) in the
band_matrix_solve!
, which has improved performance. PR #1735. - We've specialized some cases in
run_field_matrix_solver!
, which results in more efficient kernels being launched. PR #1732. - We've reduced memory reads in the
band_matrix_solve!
for tridiagonal systems, improving its performance. PR #1731. - We've added NVTX annotations in ClimaCore functions, so that we have a more granular trace of performance. PRs #1726, #1723.
- Extend adapt_structure for all operator and boundary
condition types. Also use
unrolled_map
inmultiply_matrix_at_index
to avoid the recursive inference limit when compiling nested matrix operations. PR #1684 -
Remapper
s can now process multipleField
s at the same time if created with somebuffer_lenght > 1
. PR (#1669) Machine-precision differences are expected. This change is breaking because remappers now return the same array type as the input field. - We inlined the
multiple_field_solve
kernels, which should improve performance. PR #1715. - We added support for MultiBroadcastFusion, which allows users to fuse similar space point-wise broadcast expressions via
Fields.@fused_direct
. PR #1641.
- We fixed some fieldvector broadcasting on Julia 1.9. PR #1658.
- We fixed an inference failure with matrix field broadcasting. PR #1683.
- We now always inline for all ClimaCore kernels. PR #1647. This can result in more brittle inference (due to compiler heuristics). Technically, this is not a breaking change, but some code changes may be needed in practice.
- fixed array allocation for interpolation on CPU. PR #1643.
- fixed edge case in interpolation that led to incorrect vertical interpolation. PR #1640.
- fixed
interpolate!
for MPI runs. PR #1642.
- support for many deprecated methods have been dropped PR #1632.
- Slight performance improvement by replacing
rdiv
withrmul
. PR (#1496) Machine-precision differences are expected. - Rewritten
distributed_remapping
. Newdistributed_remapping
is non-allocating and up to 1000x faster (on GPUs). Newdistributed_remapping
no longer supports thephysical_z
argument (this option is still available inRemapping.interpolate_column
). Newinterpolate!
function is available for remapping in-place. The new preferred way to define aRampper
isRemapper(space, target_hcoords, target_zcoords)
(instead ofRemapper(target_hcoords, target_zcoords, space)
). PR (#1630)