@@ -500,8 +500,7 @@ def _get_target_grid_cube(
500500 elif isinstance (target_grid , (str , Path )) and os .path .isfile (target_grid ):
501501 target_grid_cube = iris .load_cube (target_grid )
502502 elif isinstance (target_grid , str ):
503- # Generate a target grid from the provided cell-specification,
504- # and cache the resulting stock cube for later use.
503+ # Generate a target grid from the provided cell-specification
505504 target_grid_cube = _global_stock_cube (
506505 target_grid , lat_offset , lon_offset
507506 )
@@ -642,7 +641,12 @@ def _load_generic_scheme(scheme: dict):
642641_CACHED_REGRIDDERS : dict [tuple , dict ] = {}
643642
644643
645- def _get_regridder (src_cube : Cube , tgt_cube : Cube , scheme : str | dict ):
644+ def _get_regridder (
645+ src_cube : Cube ,
646+ tgt_cube : Cube ,
647+ scheme : str | dict ,
648+ cache_weights : bool ,
649+ ):
646650 """Get regridder to actually perform regridding.
647651
648652 Note
@@ -652,25 +656,33 @@ def _get_regridder(src_cube: Cube, tgt_cube: Cube, scheme: str | dict):
652656 interpolation_and_regridding.html#caching-a-regridder.)
653657
654658 """
655- # Use existing regridder if possible. This first checks the regridding
656- # scheme name and shapes of source and target coordinates, and only if
657- # these match check coordinates themselves (this is much more expensive).
658- coord_key = _get_coord_key (src_cube , tgt_cube )
659- name_shape_key = _get_name_and_shape_key (src_cube , tgt_cube , scheme )
660- if name_shape_key in _CACHED_REGRIDDERS :
661- # We cannot simply do a test for `coord_key in
662- # _CACHED_REGRIDDERS[shape_key]` below since the hash() of a coordinate
663- # is simply its id() (thus, coordinates loaded from two different files
664- # would never be considered equal)
665- for (key , regridder ) in _CACHED_REGRIDDERS [name_shape_key ].items ():
666- if key == coord_key :
667- return regridder
668-
669- # If regridder is not cached yet, return a new one and cache it
670- loaded_scheme = _load_scheme (src_cube , scheme )
671- regridder = loaded_scheme .regridder (src_cube , tgt_cube )
672- _CACHED_REGRIDDERS .setdefault (name_shape_key , {})
673- _CACHED_REGRIDDERS [name_shape_key ][coord_key ] = regridder
659+ # (1) Weights caching enabled
660+ if cache_weights :
661+ # To search for a matching regridder in the cache, first check the
662+ # regridding scheme name and shapes of source and target coordinates.
663+ # Only if these match, check coordinates themselves (this is much more
664+ # expensive).
665+ coord_key = _get_coord_key (src_cube , tgt_cube )
666+ name_shape_key = _get_name_and_shape_key (src_cube , tgt_cube , scheme )
667+ if name_shape_key in _CACHED_REGRIDDERS :
668+ # We cannot simply do a test for `coord_key in
669+ # _CACHED_REGRIDDERS[shape_key]` below since the hash() of a
670+ # coordinate is simply its id() (thus, coordinates loaded from two
671+ # different files would never be considered equal)
672+ for (key , regridder ) in _CACHED_REGRIDDERS [name_shape_key ].items ():
673+ if key == coord_key :
674+ return regridder
675+
676+ # Regridder is not in cached -> return a new one and cache it
677+ loaded_scheme = _load_scheme (src_cube , scheme )
678+ regridder = loaded_scheme .regridder (src_cube , tgt_cube )
679+ _CACHED_REGRIDDERS .setdefault (name_shape_key , {})
680+ _CACHED_REGRIDDERS [name_shape_key ][coord_key ] = regridder
681+
682+ # (2) Weights caching disabled
683+ else :
684+ loaded_scheme = _load_scheme (src_cube , scheme )
685+ regridder = loaded_scheme .regridder (src_cube , tgt_cube )
674686
675687 return regridder
676688
@@ -701,6 +713,7 @@ def regrid(
701713 scheme : str | dict ,
702714 lat_offset : bool = True ,
703715 lon_offset : bool = True ,
716+ cache_weights : bool = False ,
704717) -> Cube :
705718 """Perform horizontal regridding.
706719
@@ -747,6 +760,13 @@ def regrid(
747760 Offset the grid centers of the longitude coordinate w.r.t. Greenwich
748761 meridian by half a grid step. This argument is ignored if
749762 `target_grid` is a cube or file.
763+ cache_weights:
764+ If ``True``, cache regridding weights for later usage. This can speed
765+ up the regridding of different datasets with similar source and target
766+ grids massively, but may take up a lot of memory for extremely
767+ high-resolution data. This option is ignored for schemes that do not
768+ support weights caching. A list of supported schemes is available in
769+ the section on :ref:`regridding_schemes`.
750770
751771 Returns
752772 -------
@@ -816,7 +836,7 @@ def regrid(
816836 # Load scheme and reuse existing regridder if possible
817837 if isinstance (scheme , str ):
818838 scheme = scheme .lower ()
819- regridder = _get_regridder (cube , target_grid_cube , scheme )
839+ regridder = _get_regridder (cube , target_grid_cube , scheme , cache_weights )
820840
821841 # Rechunk and actually perform the regridding
822842 cube = _rechunk (cube , target_grid_cube )
0 commit comments