diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 585b145d..4e47cc3c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -26,10 +26,6 @@ repos: fv3core/pace/fv3core/stencils/fv_subgridz.py | fv3core/tests/conftest.py )$ - - id: mypy - name: mypy-util - args: [--config-file, setup.cfg] - files: ^util - id: mypy name: mypy-stencils args: [--config-file, setup.cfg] @@ -53,10 +49,10 @@ repos: - id: mypy name: mypy-dsl args: [--config-file, setup.cfg] - files: dsl + files: ndsl exclude: | (?x)^( - dsl/pace/dsl/gt4py_utils.py | + ndsl/ndsl/gt4py_utils.py | )$ - repo: https://github.com/pre-commit/pre-commit-hooks rev: v2.3.0 diff --git a/driver/examples/stencil_signatures.py b/driver/examples/stencil_signatures.py index 75144abe..b23cef99 100644 --- a/driver/examples/stencil_signatures.py +++ b/driver/examples/stencil_signatures.py @@ -4,15 +4,15 @@ import yaml +import ndsl.dsl +import ndsl.util import pace.driver -import pace.dsl -import pace.util def has_stencils(object): for name in dir(object): try: - stencil_found = isinstance(getattr(object, name), pace.dsl.FrozenStencil) + stencil_found = isinstance(getattr(object, name), ndsl.dsl.FrozenStencil) except (AttributeError, RuntimeError): stencil_found = False if stencil_found: @@ -26,7 +26,7 @@ def report_stencils(obj, file: Optional[TextIO]): print(f"module {module.__name__}, class {obj.__class__.__name__}:", file=file) all_access_names = collections.defaultdict(list) for name, value in obj.__dict__.items(): - if isinstance(value, pace.dsl.FrozenStencil): + if isinstance(value, ndsl.dsl.FrozenStencil): print(f" stencil {name}:", file=file) for arg_name, field_info in value.stencil_object.field_info.items(): if field_info is None: diff --git a/driver/pace/driver/comm.py b/driver/pace/driver/comm.py index 36798696..9395961b 100644 --- a/driver/pace/driver/comm.py +++ b/driver/pace/driver/comm.py @@ -3,13 +3,11 @@ import os from typing import Any, ClassVar, List -import pace.driver -import pace.dsl -import pace.stencils -import pace.util -import pace.util.grid -from pace.util.caching_comm import CachingCommReader, CachingCommWriter -from pace.util.comm import Comm +import ndsl.stencils +import ndsl.util +import ndsl.util.grid +from ndsl.util.caching_comm import CachingCommReader, CachingCommWriter +from ndsl.util.comm import Comm from .registry import Registry @@ -86,7 +84,7 @@ class MPICommConfig(CreatesComm): """ def get_comm(self): - return pace.util.MPIComm() + return ndsl.util.MPIComm() def cleanup(self, comm): pass @@ -113,7 +111,7 @@ class NullCommConfig(CreatesComm): fill_value: float = 0.0 def get_comm(self): - return pace.util.NullComm( + return ndsl.util.NullComm( rank=self.rank, total_ranks=self.total_ranks, fill_value=self.fill_value ) @@ -144,7 +142,7 @@ class WriterCommConfig(CreatesComm): def get_comm(self) -> CachingCommWriter: underlying = MPICommConfig().get_comm() if underlying.Get_rank() in self.ranks: - return pace.util.CachingCommWriter(underlying) + return ndsl.util.CachingCommWriter(underlying) else: return underlying @@ -181,7 +179,7 @@ class ReaderCommConfig(CreatesComm): def get_comm(self) -> CachingCommReader: with open(os.path.join(self.path, f"comm_{self.rank}.pkl"), "rb") as f: - return pace.util.CachingCommReader.load(f) + return ndsl.util.CachingCommReader.load(f) def cleanup(self, comm: CachingCommWriter): pass diff --git a/driver/pace/driver/configs/comm.py b/driver/pace/driver/configs/comm.py index 5f2c8c1b..f0a95542 100644 --- a/driver/pace/driver/configs/comm.py +++ b/driver/pace/driver/configs/comm.py @@ -5,12 +5,11 @@ import dacite -import pace.driver -import pace.dsl -import pace.stencils -import pace.util -import pace.util.grid -from pace.util.caching_comm import CachingCommReader, CachingCommWriter +import ndsl.dsl +import ndsl.stencils +import ndsl.util +import ndsl.util.grid +from ndsl.util.caching_comm import CachingCommReader, CachingCommWriter class CreatesComm(abc.ABC): @@ -85,7 +84,7 @@ class MPICommConfig(CreatesComm): """ def get_comm(self): - return pace.util.MPIComm() + return ndsl.util.MPIComm() def cleanup(self, comm): pass @@ -112,7 +111,7 @@ class NullCommConfig(CreatesComm): fill_value: float def get_comm(self): - return pace.util.NullComm( + return ndsl.util.NullComm( rank=self.rank, total_ranks=self.total_ranks, fill_value=self.fill_value ) @@ -143,7 +142,7 @@ class WriterCommConfig(CreatesComm): def get_comm(self) -> CachingCommWriter: underlying = MPICommConfig().get_comm() if underlying.Get_rank() in self.ranks: - return pace.util.CachingCommWriter(underlying) + return ndsl.util.CachingCommWriter(underlying) else: return underlying @@ -180,7 +179,7 @@ class ReaderCommConfig(CreatesComm): def get_comm(self) -> CachingCommReader: with open(os.path.join(self.path, f"comm_{self.rank}.pkl"), "rb") as f: - return pace.util.CachingCommReader.load(f) + return ndsl.util.CachingCommReader.load(f) def cleanup(self, comm: CachingCommWriter): pass diff --git a/driver/pace/driver/diagnostics.py b/driver/pace/driver/diagnostics.py index 36f5960a..6cab4d81 100644 --- a/driver/pace/driver/diagnostics.py +++ b/driver/pace/driver/diagnostics.py @@ -4,14 +4,13 @@ from datetime import datetime, timedelta from typing import List, Optional, Union -import pace.driver -import pace.dsl -import pace.stencils -import pace.util -import pace.util.grid -from pace.dsl.dace.orchestration import dace_inhibitor +import ndsl.dsl +import ndsl.stencils +import ndsl.util +import ndsl.util.grid +from ndsl.dsl.dace.orchestration import dace_inhibitor +from ndsl.util.constants import RGRAV from pace.fv3core.dycore_state import DycoreState -from pace.util.constants import RGRAV from .state import DriverState @@ -28,7 +27,7 @@ def store(self, time: Union[datetime, timedelta], state: DriverState): ... @abc.abstractmethod - def store_grid(self, grid_data: pace.util.grid.GridData): + def store_grid(self, grid_data: ndsl.util.grid.GridData): ... @abc.abstractmethod @@ -48,14 +47,14 @@ def select_data(self, state: DycoreState): raise ValueError(f"Invalid state variable {name} for level select") assert len(getattr(state, name).dims) > 2 if getattr(state, name).dims[2] != ( - pace.util.Z_DIM or pace.util.Z_INTERFACE_DIM + ndsl.util.Z_DIM or ndsl.util.Z_INTERFACE_DIM ): raise ValueError( f"z_select only works for state variables with dimension (x, y, z). \ \n {name} has dimension {getattr(state, name).dims}" ) var_name = f"{name}_z{self.level}" - output[var_name] = pace.util.Quantity( + output[var_name] = ndsl.util.Quantity( getattr(state, name).data[:, :, self.level], dims=getattr(state, name).dims[0:2], origin=getattr(state, name).origin[0:2], @@ -100,7 +99,7 @@ def __post_init__(self): f"got {self.output_format}" ) - def diagnostics_factory(self, communicator: pace.util.Communicator) -> Diagnostics: + def diagnostics_factory(self, communicator: ndsl.util.Communicator) -> Diagnostics: """ Create a diagnostics object. @@ -111,18 +110,18 @@ def diagnostics_factory(self, communicator: pace.util.Communicator) -> Diagnosti if self.path is None: diagnostics: Diagnostics = NullDiagnostics() else: - fs = pace.util.get_fs(self.path) + fs = ndsl.util.get_fs(self.path) if not fs.exists(self.path): fs.makedirs(self.path, exist_ok=True) if self.output_format == "zarr": store = zarr_storage.DirectoryStore(path=self.path) - monitor: pace.util.Monitor = pace.util.ZarrMonitor( + monitor: ndsl.util.Monitor = ndsl.util.ZarrMonitor( store=store, partitioner=communicator.partitioner, mpi_comm=communicator.comm, ) elif self.output_format == "netcdf": - monitor = pace.util.NetCDFMonitor( + monitor = ndsl.util.NetCDFMonitor( path=self.path, communicator=communicator, time_chunk_size=self.time_chunk_size, @@ -146,7 +145,7 @@ class MonitorDiagnostics(Diagnostics): def __init__( self, - monitor: pace.util.Monitor, + monitor: ndsl.util.Monitor, names: List[str], derived_names: List[str], z_select: List[ZSelect], @@ -198,7 +197,7 @@ def _get_z_select_state(self, state: DycoreState): z_select_state.update(zselect.select_data(state)) return z_select_state - def store_grid(self, grid_data: pace.util.grid.GridData): + def store_grid(self, grid_data: ndsl.util.grid.GridData): zarr_grid = { "lat": grid_data.lat, "lon": grid_data.lon, @@ -218,7 +217,7 @@ class NullDiagnostics(Diagnostics): def store(self, time: Union[datetime, timedelta], state: DriverState): pass - def store_grid(self, grid_data: pace.util.grid.GridData): + def store_grid(self, grid_data: ndsl.util.grid.GridData): pass def cleanup(self): @@ -226,7 +225,7 @@ def cleanup(self): def _compute_column_integral( - name: str, q_in: pace.util.Quantity, delp: pace.util.Quantity + name: str, q_in: ndsl.util.Quantity, delp: ndsl.util.Quantity ): """ Compute column integrated mixing ratio (e.g., total liquid water path) @@ -237,12 +236,12 @@ def _compute_column_integral( delp: pressure thickness of atmospheric layer """ assert len(q_in.dims) > 2 - if q_in.dims[2] != pace.util.Z_DIM: + if q_in.dims[2] != ndsl.util.Z_DIM: raise NotImplementedError( "this function assumes the z-dimension is the third dimension" ) k_slice = slice(q_in.origin[2], q_in.origin[2] + q_in.extent[2]) - column_integral = pace.util.Quantity( + column_integral = ndsl.util.Quantity( RGRAV * q_in.np.sum(q_in.data[:, :, k_slice] * delp.data[:, :, k_slice], axis=2), dims=tuple(q_in.dims[:2]) + tuple(q_in.dims[3:]), diff --git a/driver/pace/driver/driver.py b/driver/pace/driver/driver.py index 24197621..2a0a1b93 100644 --- a/driver/pace/driver/driver.py +++ b/driver/pace/driver/driver.py @@ -9,27 +9,27 @@ import dacite import yaml +import ndsl.dsl +import ndsl.stencils +import ndsl.util +import ndsl.util.grid import pace.driver -import pace.dsl import pace.physics -import pace.stencils -import pace.util -import pace.util.grid -from pace import fv3core -from pace.driver.safety_checks import SafetyChecker -from pace.dsl.dace.dace_config import DaceConfig -from pace.dsl.dace.orchestration import dace_inhibitor, orchestrate -from pace.dsl.stencil_config import CompilationConfig, RunMode -from pace.dsl.typing import Float - -# TODO: move update_atmos_state into pace.driver -from pace.stencils import update_atmos_state -from pace.util.communicator import ( +from ndsl.dsl.dace.dace_config import DaceConfig +from ndsl.dsl.dace.orchestration import dace_inhibitor, orchestrate +from ndsl.dsl.stencil_config import CompilationConfig, RunMode +from ndsl.dsl.typing import Float +from ndsl.util.communicator import ( Communicator, CubedSphereCommunicator, TileCommunicator, ) -from pace.util.logging import pace_log +from ndsl.util.logging import pace_log +from pace import fv3core +from pace.driver.safety_checks import SafetyChecker + +# TODO: move update_atmos_state into pace.driver +from pace.physics.update import update_atmos_state from . import diagnostics from .comm import CreatesCommSelector @@ -88,7 +88,7 @@ class DriverConfig: defaults to every timestep """ - stencil_config: pace.dsl.StencilConfig + stencil_config: ndsl.dsl.StencilConfig initialization: InitializerSelector nx_tile: int nz: int @@ -163,25 +163,25 @@ def apply_tendencies(self) -> bool: def get_grid( self, - communicator: pace.util.Communicator, - quantity_factory: Optional[pace.util.QuantityFactory] = None, + communicator: ndsl.util.Communicator, + quantity_factory: Optional[ndsl.util.QuantityFactory] = None, ) -> Tuple[ - pace.util.grid.DampingCoefficients, - pace.util.grid.DriverGridData, - pace.util.grid.GridData, + ndsl.util.grid.DampingCoefficients, + ndsl.util.grid.DriverGridData, + ndsl.util.grid.GridData, ]: if quantity_factory is None: - sizer = pace.util.SubtileGridSizer.from_tile_params( + sizer = ndsl.util.SubtileGridSizer.from_tile_params( nx_tile=self.nx_tile, ny_tile=self.nx_tile, nz=self.nz, - n_halo=pace.util.N_HALO_DEFAULT, + n_halo=ndsl.util.N_HALO_DEFAULT, extra_dim_lengths={}, layout=self.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, ) - quantity_factory = pace.util.QuantityFactory.from_backend( + quantity_factory = ndsl.util.QuantityFactory.from_backend( sizer, backend=self.stencil_config.compilation_config.backend ) @@ -192,36 +192,36 @@ def get_grid( def get_driver_state( self, - communicator: pace.util.Communicator, - damping_coefficients: pace.util.grid.DampingCoefficients, - driver_grid_data: pace.util.grid.DriverGridData, - grid_data: pace.util.grid.GridData, - quantity_factory: Optional[pace.util.QuantityFactory] = None, - stencil_factory: Optional[pace.dsl.StencilFactory] = None, + communicator: ndsl.util.Communicator, + damping_coefficients: ndsl.util.grid.DampingCoefficients, + driver_grid_data: ndsl.util.grid.DriverGridData, + grid_data: ndsl.util.grid.GridData, + quantity_factory: Optional[ndsl.util.QuantityFactory] = None, + stencil_factory: Optional[ndsl.dsl.StencilFactory] = None, ) -> DriverState: """Load the initial state of the driver.""" if quantity_factory is None or stencil_factory is None: - sizer = pace.util.SubtileGridSizer.from_tile_params( + sizer = ndsl.util.SubtileGridSizer.from_tile_params( nx_tile=self.nx_tile, ny_tile=self.nx_tile, nz=self.nz, - n_halo=pace.util.N_HALO_DEFAULT, + n_halo=ndsl.util.N_HALO_DEFAULT, extra_dim_lengths={}, layout=self.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, ) if quantity_factory is None: - quantity_factory = pace.util.QuantityFactory.from_backend( + quantity_factory = ndsl.util.QuantityFactory.from_backend( sizer, backend=self.stencil_config.compilation_config.backend ) if stencil_factory is None: grid_indexing = ( - pace.dsl.stencil.GridIndexing.from_sizer_and_communicator( + ndsl.dsl.stencil.GridIndexing.from_sizer_and_communicator( sizer=sizer, comm=communicator ) ) - stencil_factory = pace.dsl.StencilFactory( + stencil_factory = ndsl.dsl.StencilFactory( config=self.stencil_config, grid_indexing=grid_indexing ) @@ -352,7 +352,7 @@ def write_final_if_enabled( self, state: DriverState, *, - comm: pace.util.Comm, + comm: ndsl.util.Comm, time: datetime, driver_config: DriverConfig, restart_path: str, @@ -370,7 +370,7 @@ def write_intermediate_if_enabled( state: DriverState, *, step: int, - comm: pace.util.Comm, + comm: ndsl.util.Comm, time: Union[datetime, timedelta], driver_config: DriverConfig, restart_path: str, @@ -628,7 +628,7 @@ def _end_of_step_actions(self, step: int): def _critical_path_step_all( self, steps_count: int, - timer: pace.util.Timer, + timer: ndsl.util.Timer, dt: Float, ): """Start of code path where performance is critical. @@ -714,7 +714,7 @@ def cleanup(self): self.comm_config.cleanup(self.comm) -def log_subtile_location(partitioner: pace.util.TilePartitioner, rank: int): +def log_subtile_location(partitioner: ndsl.util.TilePartitioner, rank: int): location_info = { "north": partitioner.on_tile_top(rank), "south": partitioner.on_tile_bottom(rank), @@ -726,9 +726,9 @@ def log_subtile_location(partitioner: pace.util.TilePartitioner, rank: int): def _setup_factories( config: DriverConfig, - communicator: pace.util.Communicator, + communicator: ndsl.util.Communicator, stencil_compare_comm, -) -> Tuple[pace.util.QuantityFactory, pace.dsl.StencilFactory]: +) -> Tuple[ndsl.util.QuantityFactory, ndsl.dsl.StencilFactory]: """ Args: config: configuration of driver @@ -742,24 +742,24 @@ def _setup_factories( stencil_factory: creates Stencils """ - sizer = pace.util.SubtileGridSizer.from_tile_params( + sizer = ndsl.util.SubtileGridSizer.from_tile_params( nx_tile=config.nx_tile, ny_tile=config.nx_tile, nz=config.nz, - n_halo=pace.util.N_HALO_DEFAULT, + n_halo=ndsl.util.N_HALO_DEFAULT, extra_dim_lengths={}, layout=config.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, ) - grid_indexing = pace.dsl.stencil.GridIndexing.from_sizer_and_communicator( + grid_indexing = ndsl.dsl.stencil.GridIndexing.from_sizer_and_communicator( sizer=sizer, comm=communicator ) - quantity_factory = pace.util.QuantityFactory.from_backend( + quantity_factory = ndsl.util.QuantityFactory.from_backend( sizer, backend=config.stencil_config.compilation_config.backend ) - stencil_factory = pace.dsl.StencilFactory( + stencil_factory = ndsl.dsl.StencilFactory( config=config.stencil_config, grid_indexing=grid_indexing, comm=stencil_compare_comm, diff --git a/driver/pace/driver/grid.py b/driver/pace/driver/grid.py index e1c3b057..1d6239f7 100644 --- a/driver/pace/driver/grid.py +++ b/driver/pace/driver/grid.py @@ -5,29 +5,27 @@ import f90nml import xarray as xr -import pace.driver -import pace.dsl -import pace.physics -import pace.stencils -import pace.util -import pace.util.grid -from pace.stencils.testing import TranslateGrid -from pace.util import Communicator, QuantityFactory -from pace.util.grid import ( +import ndsl.dsl +import ndsl.stencils +import ndsl.util +import ndsl.util.grid +from ndsl.stencils.testing import TranslateGrid +from ndsl.util import Communicator, QuantityFactory +from ndsl.util.grid import ( DampingCoefficients, DriverGridData, GridData, MetricTerms, direct_transform, ) -from pace.util.grid.helper import ( +from ndsl.util.grid.helper import ( AngleGridData, ContravariantGridData, HorizontalGridData, VerticalGridData, ) -from pace.util.logging import pace_log -from pace.util.namelist import Namelist +from ndsl.util.logging import pace_log +from ndsl.util.namelist import Namelist from .registry import Registry @@ -36,8 +34,8 @@ class GridInitializer(abc.ABC): @abc.abstractmethod def get_grid( self, - quantity_factory: pace.util.QuantityFactory, - communicator: pace.util.Communicator, + quantity_factory: ndsl.util.QuantityFactory, + communicator: ndsl.util.Communicator, ) -> Tuple[DampingCoefficients, DriverGridData, GridData]: ... @@ -162,7 +160,7 @@ def _f90_namelist(self) -> f90nml.Namelist: def _namelist(self) -> Namelist: return Namelist.from_f90nml(self._f90_namelist) - def _serializer(self, communicator: pace.util.Communicator): + def _serializer(self, communicator: ndsl.util.Communicator): import serialbox serializer = serialbox.Serializer( @@ -174,9 +172,9 @@ def _serializer(self, communicator: pace.util.Communicator): def _get_serialized_grid( self, - communicator: pace.util.Communicator, + communicator: ndsl.util.Communicator, backend: str, - ) -> pace.stencils.testing.grid.Grid: # type: ignore + ) -> ndsl.stencils.testing.grid.Grid: # type: ignore ser = self._serializer(communicator) grid = TranslateGrid.new_from_serialized_data( ser, communicator.rank, self._namelist.layout, backend @@ -189,7 +187,7 @@ def get_grid( communicator: Communicator, ) -> Tuple[DampingCoefficients, DriverGridData, GridData]: backend = quantity_factory.zeros( - dims=[pace.util.X_DIM, pace.util.Y_DIM], units="unknown" + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="unknown" ).gt4py_backend pace_log.info("Using serialized grid data") @@ -237,13 +235,12 @@ def get_grid( quantity_factory: QuantityFactory, communicator: Communicator, ) -> Tuple[DampingCoefficients, DriverGridData, GridData]: - pace_log.info("Using external grid data") # ToDo: refactor when grid_type is an enum if self.grid_type <= 3: tile_num = ( - pace.util.get_tile_index( + ndsl.util.get_tile_index( communicator.rank, communicator.partitioner.total_ranks ) + 1 @@ -260,7 +257,7 @@ def get_grid( subtile_slice_grid = communicator.partitioner.tile.subtile_slice( rank=communicator.rank, - global_dims=[pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM], + global_dims=[ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM], global_extent=(npy, npx), overlap=True, ) diff --git a/driver/pace/driver/initialization.py b/driver/pace/driver/initialization.py index 04b08d3d..b12994ae 100644 --- a/driver/pace/driver/initialization.py +++ b/driver/pace/driver/initialization.py @@ -7,20 +7,20 @@ import f90nml +import ndsl.dsl +import ndsl.stencils +import ndsl.util +import ndsl.util.grid import pace.driver -import pace.dsl import pace.fv3core.initialization.analytic_init as analytic_init import pace.physics -import pace.stencils -import pace.util -import pace.util.grid +from ndsl.dsl.dace.orchestration import DaceConfig +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.stencil_config import CompilationConfig +from ndsl.stencils.testing import TranslateGrid +from ndsl.util.namelist import Namelist from pace import fv3core -from pace.dsl.dace.orchestration import DaceConfig -from pace.dsl.stencil import StencilFactory -from pace.dsl.stencil_config import CompilationConfig from pace.fv3core.testing import TranslateFVDynamics -from pace.stencils.testing import TranslateGrid -from pace.util.namelist import Namelist from .registry import Registry from .state import DriverState, TendencyState, _restart_driver_state @@ -35,11 +35,11 @@ def start_time(self) -> datetime: @abc.abstractmethod def get_driver_state( self, - quantity_factory: pace.util.QuantityFactory, - communicator: pace.util.Communicator, - damping_coefficients: pace.util.grid.DampingCoefficients, - driver_grid_data: pace.util.grid.DriverGridData, - grid_data: pace.util.grid.GridData, + quantity_factory: ndsl.util.QuantityFactory, + communicator: ndsl.util.Communicator, + damping_coefficients: ndsl.util.grid.DampingCoefficients, + driver_grid_data: ndsl.util.grid.DriverGridData, + grid_data: ndsl.util.grid.GridData, schemes: List[pace.physics.PHYSICS_PACKAGES], ) -> DriverState: ... @@ -73,11 +73,11 @@ def start_time(self) -> datetime: def get_driver_state( self, - quantity_factory: pace.util.QuantityFactory, - communicator: pace.util.Communicator, - damping_coefficients: pace.util.grid.DampingCoefficients, - driver_grid_data: pace.util.grid.DriverGridData, - grid_data: pace.util.grid.GridData, + quantity_factory: ndsl.util.QuantityFactory, + communicator: ndsl.util.Communicator, + damping_coefficients: ndsl.util.grid.DampingCoefficients, + driver_grid_data: ndsl.util.grid.DriverGridData, + grid_data: ndsl.util.grid.GridData, schemes: List[pace.physics.PHYSICS_PACKAGES], ) -> DriverState: return self.config.get_driver_state( @@ -107,11 +107,11 @@ class AnalyticInit(Initializer): def get_driver_state( self, - quantity_factory: pace.util.QuantityFactory, - communicator: pace.util.Communicator, - damping_coefficients: pace.util.grid.DampingCoefficients, - driver_grid_data: pace.util.grid.DriverGridData, - grid_data: pace.util.grid.GridData, + quantity_factory: ndsl.util.QuantityFactory, + communicator: ndsl.util.Communicator, + damping_coefficients: ndsl.util.grid.DampingCoefficients, + driver_grid_data: ndsl.util.grid.DriverGridData, + grid_data: ndsl.util.grid.GridData, schemes: List[pace.physics.PHYSICS_PACKAGES], ) -> DriverState: dycore_state = analytic_init.init_analytic_state( @@ -151,11 +151,11 @@ class RestartInit(Initializer): def get_driver_state( self, - quantity_factory: pace.util.QuantityFactory, - communicator: pace.util.Communicator, - damping_coefficients: pace.util.grid.DampingCoefficients, - driver_grid_data: pace.util.grid.DriverGridData, - grid_data: pace.util.grid.GridData, + quantity_factory: ndsl.util.QuantityFactory, + communicator: ndsl.util.Communicator, + damping_coefficients: ndsl.util.grid.DampingCoefficients, + driver_grid_data: ndsl.util.grid.DriverGridData, + grid_data: ndsl.util.grid.GridData, schemes: List[pace.physics.PHYSICS_PACKAGES], ) -> DriverState: state = _restart_driver_state( @@ -202,11 +202,11 @@ def start_time(self) -> datetime: def get_driver_state( self, - quantity_factory: pace.util.QuantityFactory, - communicator: pace.util.Communicator, - damping_coefficients: pace.util.grid.DampingCoefficients, - driver_grid_data: pace.util.grid.DriverGridData, - grid_data: pace.util.grid.GridData, + quantity_factory: ndsl.util.QuantityFactory, + communicator: ndsl.util.Communicator, + damping_coefficients: ndsl.util.grid.DampingCoefficients, + driver_grid_data: ndsl.util.grid.DriverGridData, + grid_data: ndsl.util.grid.GridData, schemes: List[pace.physics.PHYSICS_PACKAGES], ) -> DriverState: state = _restart_driver_state( @@ -254,16 +254,16 @@ def _namelist(self) -> Namelist: def _get_serialized_grid( self, - communicator: pace.util.Communicator, + communicator: ndsl.util.Communicator, backend: str, - ) -> pace.stencils.testing.grid.Grid: # type: ignore + ) -> ndsl.stencils.testing.grid.Grid: # type: ignore ser = self._serializer(communicator) grid = TranslateGrid.new_from_serialized_data( ser, communicator.rank, self._namelist.layout, backend ).python_grid() return grid - def _serializer(self, communicator: pace.util.Communicator): + def _serializer(self, communicator: ndsl.util.Communicator): import serialbox serializer = serialbox.Serializer( @@ -275,15 +275,15 @@ def _serializer(self, communicator: pace.util.Communicator): def get_driver_state( self, - quantity_factory: pace.util.QuantityFactory, - communicator: pace.util.Communicator, - damping_coefficients: pace.util.grid.DampingCoefficients, - driver_grid_data: pace.util.grid.DriverGridData, - grid_data: pace.util.grid.GridData, + quantity_factory: ndsl.util.QuantityFactory, + communicator: ndsl.util.Communicator, + damping_coefficients: ndsl.util.grid.DampingCoefficients, + driver_grid_data: ndsl.util.grid.DriverGridData, + grid_data: ndsl.util.grid.GridData, schemes: List[pace.physics.PHYSICS_PACKAGES], ) -> DriverState: backend = quantity_factory.zeros( - dims=[pace.util.X_DIM, pace.util.Y_DIM], units="unknown" + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="unknown" ).gt4py_backend dycore_state = self._initialize_dycore_state(communicator, backend) @@ -304,7 +304,7 @@ def get_driver_state( def _initialize_dycore_state( self, - communicator: pace.util.Communicator, + communicator: ndsl.util.Communicator, backend: str, ) -> fv3core.DycoreState: grid = self._get_serialized_grid(communicator=communicator, backend=backend) @@ -317,7 +317,7 @@ def _initialize_dycore_state( tile_nx=self._namelist.npx, tile_nz=self._namelist.npz, ) - stencil_config = pace.dsl.stencil.StencilConfig( + stencil_config = ndsl.dsl.stencil.StencilConfig( compilation_config=CompilationConfig( backend=backend, communicator=communicator ), @@ -346,18 +346,18 @@ class PredefinedStateInit(Initializer): dycore_state: fv3core.DycoreState physics_state: pace.physics.PhysicsState tendency_state: TendencyState - grid_data: pace.util.grid.GridData - damping_coefficients: pace.util.grid.DampingCoefficients - driver_grid_data: pace.util.grid.DriverGridData + grid_data: ndsl.util.grid.GridData + damping_coefficients: ndsl.util.grid.DampingCoefficients + driver_grid_data: ndsl.util.grid.DriverGridData start_time: datetime = datetime(2016, 8, 1) def get_driver_state( self, - quantity_factory: pace.util.QuantityFactory, - communicator: pace.util.Communicator, - damping_coefficients: pace.util.grid.DampingCoefficients, - driver_grid_data: pace.util.grid.DriverGridData, - grid_data: pace.util.grid.GridData, + quantity_factory: ndsl.util.QuantityFactory, + communicator: ndsl.util.Communicator, + damping_coefficients: ndsl.util.grid.DampingCoefficients, + driver_grid_data: ndsl.util.grid.DriverGridData, + grid_data: ndsl.util.grid.GridData, schemes: List[pace.physics.PHYSICS_PACKAGES], ) -> DriverState: return DriverState( diff --git a/driver/pace/driver/performance/collector.py b/driver/pace/driver/performance/collector.py index cbc6c62a..d06e7a83 100644 --- a/driver/pace/driver/performance/collector.py +++ b/driver/pace/driver/performance/collector.py @@ -6,7 +6,9 @@ import numpy as np -import pace.util +import ndsl.util +from ndsl.util._optional_imports import cupy as cp +from ndsl.util.utils import GPU_AVAILABLE from pace.driver.performance.report import ( Report, TimeReport, @@ -15,15 +17,13 @@ get_experiment_info, write_to_timestamped_json, ) -from pace.util._optional_imports import cupy as cp -from pace.util.utils import GPU_AVAILABLE from .report import collect_data_and_write_to_file class AbstractPerformanceCollector(Protocol): - total_timer: pace.util.Timer - timestep_timer: pace.util.Timer + total_timer: ndsl.util.Timer + timestep_timer: ndsl.util.Timer def collect_performance(self): ... @@ -58,11 +58,11 @@ def mark_cuda_profiler(cls, message: str): class PerformanceCollector(AbstractPerformanceCollector): - def __init__(self, experiment_name: str, comm: pace.util.Comm): + def __init__(self, experiment_name: str, comm: ndsl.util.Comm): self.times_per_step: List[Mapping[str, float]] = [] self.hits_per_step: List[Mapping[str, int]] = [] - self.timestep_timer = pace.util.Timer() - self.total_timer = pace.util.Timer() + self.timestep_timer = ndsl.util.Timer() + self.total_timer = ndsl.util.Timer() self.experiment_name = experiment_name self.comm = comm @@ -157,8 +157,8 @@ def write_out_performance( class NullPerformanceCollector(AbstractPerformanceCollector): def __init__(self): - self.total_timer = pace.util.NullTimer() - self.timestep_timer = pace.util.NullTimer() + self.total_timer = ndsl.util.NullTimer() + self.timestep_timer = ndsl.util.NullTimer() def collect_performance(self): pass diff --git a/driver/pace/driver/performance/config.py b/driver/pace/driver/performance/config.py index 2a2e66db..516c206e 100644 --- a/driver/pace/driver/performance/config.py +++ b/driver/pace/driver/performance/config.py @@ -1,7 +1,7 @@ import dataclasses -import pace.util -from pace.util import NullProfiler, Profiler +import ndsl.util +from ndsl.util import NullProfiler, Profiler from .collector import ( AbstractPerformanceCollector, @@ -28,7 +28,7 @@ class PerformanceConfig: experiment_name: str = "test" json_all_rank_threshold: int = 1000 - def build(self, comm: pace.util.Comm) -> AbstractPerformanceCollector: + def build(self, comm: ndsl.util.Comm) -> AbstractPerformanceCollector: if self.collect_performance: return PerformanceCollector(experiment_name=self.experiment_name, comm=comm) else: diff --git a/driver/pace/driver/performance/report.py b/driver/pace/driver/performance/report.py index 4160df0f..8df2f3f9 100644 --- a/driver/pace/driver/performance/report.py +++ b/driver/pace/driver/performance/report.py @@ -6,7 +6,7 @@ import numpy as np -from pace.util.comm import Comm +from ndsl.util.comm import Comm @dataclasses.dataclass diff --git a/driver/pace/driver/run.py b/driver/pace/driver/run.py index df70eb14..5da7bbbc 100644 --- a/driver/pace/driver/run.py +++ b/driver/pace/driver/run.py @@ -5,7 +5,7 @@ import click import yaml -from pace.util import AVAILABLE_LOG_LEVELS, pace_log +from ndsl.util import AVAILABLE_LOG_LEVELS, pace_log from .driver import Driver, DriverConfig diff --git a/driver/pace/driver/safety_checks.py b/driver/pace/driver/safety_checks.py index 4ae2b8fd..173f7f4f 100644 --- a/driver/pace/driver/safety_checks.py +++ b/driver/pace/driver/safety_checks.py @@ -2,8 +2,8 @@ import numpy as np +from ndsl.util.quantity import Quantity from pace.fv3core.dycore_state import DycoreState -from pace.util.quantity import Quantity class VariableBounds: @@ -79,7 +79,6 @@ def check_state(self, state: DycoreState): except AttributeError: raise NotImplementedError("Variable is not in the state") if variable_bounds.compute_domain_only: - min_value = var.view[:].min() max_value = var.view[:].max() else: diff --git a/driver/pace/driver/state.py b/driver/pace/driver/state.py index 93c99b55..b36df03f 100644 --- a/driver/pace/driver/state.py +++ b/driver/pace/driver/state.py @@ -4,12 +4,12 @@ import xarray as xr -import pace.dsl.gt4py_utils as gt_utils +import ndsl.dsl.gt4py_utils as gt_utils +import ndsl.util +import ndsl.util.grid import pace.physics -import pace.util -import pace.util.grid +from ndsl.dsl.typing import Float from pace import fv3core -from pace.dsl.typing import Float @dataclasses.dataclass() @@ -19,33 +19,33 @@ class TendencyState: to the dynamical core model state. """ - u_dt: pace.util.Quantity = dataclasses.field( + u_dt: ndsl.util.Quantity = dataclasses.field( metadata={ "name": "eastward_wind_tendency_due_to_physics", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s**2", "intent": "inout", } ) - v_dt: pace.util.Quantity = dataclasses.field( + v_dt: ndsl.util.Quantity = dataclasses.field( metadata={ "name": "northward_wind_tendency_due_to_physics", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s**2", "intent": "inout", } ) - pt_dt: pace.util.Quantity = dataclasses.field( + pt_dt: ndsl.util.Quantity = dataclasses.field( metadata={ "name": "temperature_tendency_due_to_physics", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "K/s", "intent": "inout", } ) @classmethod - def init_zeros(cls, quantity_factory: pace.util.QuantityFactory) -> "TendencyState": + def init_zeros(cls, quantity_factory: ndsl.util.QuantityFactory) -> "TendencyState": initial_quantities = {} for _field in dataclasses.fields(cls): initial_quantities[_field.name] = quantity_factory.zeros( @@ -61,9 +61,9 @@ class DriverState: dycore_state: fv3core.DycoreState physics_state: pace.physics.PhysicsState tendency_state: TendencyState - grid_data: pace.util.grid.GridData - damping_coefficients: pace.util.grid.DampingCoefficients - driver_grid_data: pace.util.grid.DriverGridData + grid_data: ndsl.util.grid.GridData + damping_coefficients: ndsl.util.grid.DampingCoefficients + driver_grid_data: ndsl.util.grid.DriverGridData # TODO: the driver_config argument here isn't type hinted from # import due to a circular dependency. This can be fixed by refactoring @@ -73,26 +73,26 @@ def load_state_from_restart( cls, restart_path: str, driver_config, - damping_coefficients: pace.util.grid.DampingCoefficients, - driver_grid_data: pace.util.grid.DriverGridData, - grid_data: pace.util.grid.GridData, + damping_coefficients: ndsl.util.grid.DampingCoefficients, + driver_grid_data: ndsl.util.grid.DriverGridData, + grid_data: ndsl.util.grid.GridData, schemes: List[pace.physics.PHYSICS_PACKAGES], ) -> "DriverState": comm = driver_config.comm_config.get_comm() - communicator = pace.util.Communicator.from_layout( + communicator = ndsl.util.Communicator.from_layout( comm=comm, layout=driver_config.layout ) - sizer = pace.util.SubtileGridSizer.from_tile_params( + sizer = ndsl.util.SubtileGridSizer.from_tile_params( nx_tile=driver_config.nx_tile, ny_tile=driver_config.nx_tile, nz=driver_config.nz, - n_halo=pace.util.N_HALO_DEFAULT, + n_halo=ndsl.util.N_HALO_DEFAULT, extra_dim_lengths={}, layout=driver_config.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, ) - quantity_factory = pace.util.QuantityFactory.from_backend( + quantity_factory = ndsl.util.QuantityFactory.from_backend( sizer, backend=driver_config.stencil_config.compilation_config.backend ) @@ -174,14 +174,14 @@ def _overwrite_state_from_restart( def _restart_driver_state( path: str, rank: int, - quantity_factory: pace.util.QuantityFactory, - communicator: pace.util.Communicator, - damping_coefficients: pace.util.grid.DampingCoefficients, - driver_grid_data: pace.util.grid.DriverGridData, - grid_data: pace.util.grid.GridData, + quantity_factory: ndsl.util.QuantityFactory, + communicator: ndsl.util.Communicator, + damping_coefficients: ndsl.util.grid.DampingCoefficients, + driver_grid_data: ndsl.util.grid.DriverGridData, + grid_data: ndsl.util.grid.GridData, schemes: List[pace.physics.PHYSICS_PACKAGES], ): - fs = pace.util.get_fs(path) + fs = ndsl.util.get_fs(path) restart_files = fs.ls(path) is_fortran_restart = any( diff --git a/driver/pace/driver/tools.py b/driver/pace/driver/tools.py index c58eb6fa..7a20ecd8 100644 --- a/driver/pace/driver/tools.py +++ b/driver/pace/driver/tools.py @@ -2,7 +2,7 @@ import click -from pace.dsl.dace.utils import ( +from ndsl.dsl.dace.utils import ( kernel_theoretical_timing_from_path, memory_static_analysis_from_path, ) diff --git a/driver/setup.py b/driver/setup.py index 7607cbc5..6f217e23 100644 --- a/driver/setup.py +++ b/driver/setup.py @@ -6,10 +6,8 @@ setup_requirements: List[str] = [] requirements = [ - "pace-util", "pace-fv3core", "pace-physics", - "pace-stencils", "dacite", "pyyaml", "mpi4py", diff --git a/driver/tests/mpi/test_restart.py b/driver/tests/mpi/test_restart.py index 92c6f72b..050edd81 100644 --- a/driver/tests/mpi/test_restart.py +++ b/driver/tests/mpi/test_restart.py @@ -7,8 +7,8 @@ import zarr from mpi4py import MPI -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util from pace.driver import DriverConfig from pace.driver.state import DriverState from pace.physics import PHYSICS_PACKAGES @@ -52,11 +52,11 @@ def test_restart(): with open("RESTART/restart.yaml", "r") as f: restart_config = DriverConfig.from_dict(yaml.safe_load(f)) - mpi_comm = pace.util.NullComm(rank=0, total_ranks=6, fill_value=0.0) - partitioner = pace.util.CubedSpherePartitioner( - pace.util.TilePartitioner((1, 1)) + mpi_comm = ndsl.util.NullComm(rank=0, total_ranks=6, fill_value=0.0) + partitioner = ndsl.util.CubedSpherePartitioner( + ndsl.util.TilePartitioner((1, 1)) ) - communicator = pace.util.CubedSphereCommunicator(mpi_comm, partitioner) + communicator = ndsl.util.CubedSphereCommunicator(mpi_comm, partitioner) (damping_coefficients, driver_grid_data, grid_data,) = restart_config.get_grid( communicator=communicator, ) @@ -75,7 +75,7 @@ def test_restart(): f"RESTART/restart_dycore_state_{communicator.rank}.nc" ) for var in driver_state.dycore_state.__dict__.keys(): - if isinstance(driver_state.dycore_state.__dict__[var], pace.util.Quantity): + if isinstance(driver_state.dycore_state.__dict__[var], ndsl.util.Quantity): np.testing.assert_allclose( driver_state.dycore_state.__dict__[var].data, restart_dycore[var].values, diff --git a/dsl/pace/dsl/dace/__init__.py b/dsl/pace/dsl/dace/__init__.py deleted file mode 100644 index 5dd61826..00000000 --- a/dsl/pace/dsl/dace/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from pace.dsl.dace.dace_config import DaceConfig -from pace.dsl.dace.orchestration import orchestrate diff --git a/examples/notebooks/functions.py b/examples/notebooks/functions.py index 44d40f12..99b8e0c3 100644 --- a/examples/notebooks/functions.py +++ b/examples/notebooks/functions.py @@ -10,13 +10,10 @@ from matplotlib import animation from units_config import units -from pace.dsl.dace.dace_config import DaceConfig, DaCeOrchestration -from pace.dsl.stencil import GridIndexing, StencilConfig, StencilFactory -from pace.dsl.stencil_config import CompilationConfig, RunMode -from pace.fv3core.stencils.fvtp2d import FiniteVolumeTransport -from pace.fv3core.stencils.fxadv import FiniteVolumeFluxPrep -from pace.fv3core.stencils.tracer_2d_1l import TracerAdvection -from pace.util import ( +from ndsl.dsl.dace.dace_config import DaceConfig, DaCeOrchestration +from ndsl.dsl.stencil import GridIndexing, StencilConfig, StencilFactory +from ndsl.dsl.stencil_config import CompilationConfig, RunMode +from ndsl.util import ( CubedSphereCommunicator, CubedSpherePartitioner, Quantity, @@ -24,8 +21,8 @@ SubtileGridSizer, TilePartitioner, ) -from pace.util.constants import RADIUS -from pace.util.grid import ( +from ndsl.util.constants import RADIUS +from ndsl.util.grid import ( AngleGridData, ContravariantGridData, DampingCoefficients, @@ -34,7 +31,10 @@ MetricTerms, VerticalGridData, ) -from pace.util.grid.gnomonic import great_circle_distance_lon_lat +from ndsl.util.grid.gnomonic import great_circle_distance_lon_lat +from pace.fv3core.stencils.fvtp2d import FiniteVolumeTransport +from pace.fv3core.stencils.fxadv import FiniteVolumeFluxPrep +from pace.fv3core.stencils.tracer_2d_1l import TracerAdvection class GridType(enum.Enum): @@ -504,7 +504,6 @@ def create_initial_tracer( for jj in range(tracer_input.shape[1] - 1): for ii in range(tracer_input.shape[0] - 1): - p_dist = [lon[ii, jj], lat[ii, jj]] r = great_circle_distance_lon_lat( p_center[0], p_dist[0], p_center[1], p_dist[1], RADIUS, np diff --git a/fv3core/examples/standalone/runfile/acoustics.py b/fv3core/examples/standalone/runfile/acoustics.py index 4f898e05..1ab6c447 100755 --- a/fv3core/examples/standalone/runfile/acoustics.py +++ b/fv3core/examples/standalone/runfile/acoustics.py @@ -9,15 +9,15 @@ import yaml from timing import collect_data_and_write_to_file -import pace.dsl -import pace.util as util -from pace.dsl.dace.orchestration import DaceConfig -from pace.dsl.stencil import CompilationConfig +import ndsl.dsl +import ndsl.util as util +from ndsl.dsl.dace.orchestration import DaceConfig +from ndsl.dsl.stencil import CompilationConfig +from ndsl.stencils.testing.grid import Grid +from ndsl.util.null_comm import NullComm from pace.fv3core._config import DynamicalCoreConfig from pace.fv3core.stencils.dyn_core import AcousticDynamics from pace.fv3core.testing import TranslateDynCore -from pace.stencils.testing.grid import Grid -from pace.util.null_comm import NullComm try: @@ -48,7 +48,7 @@ def initialize_serializer(data_directory: str, rank: int = 0) -> serialbox.Seria def read_input_data( grid: Grid, namelist: DynamicalCoreConfig, - stencil_factory: pace.dsl.stencil.StencilFactory, + stencil_factory: ndsl.dsl.stencil.StencilFactory, serializer: serialbox.Serializer, ) -> Dict[str, Any]: """Uses the serializer to read the input data from disk""" @@ -150,13 +150,13 @@ def driver( tile_nx=dycore_config.npx, tile_nz=dycore_config.npz, ) - stencil_config = pace.dsl.stencil.StencilConfig( + stencil_config = ndsl.dsl.stencil.StencilConfig( compilation_config=CompilationConfig( backend=backend, rebuild=False, validate_args=True ), dace_config=dace_config, ) - stencil_factory = pace.dsl.stencil.StencilFactory( + stencil_factory = ndsl.dsl.stencil.StencilFactory( config=stencil_config, grid_indexing=grid.grid_indexing, ) diff --git a/fv3core/examples/standalone/runfile/compile.py b/fv3core/examples/standalone/runfile/compile.py index d61e7081..c9b5540a 100755 --- a/fv3core/examples/standalone/runfile/compile.py +++ b/fv3core/examples/standalone/runfile/compile.py @@ -8,9 +8,9 @@ import f90nml import gt4py.cartesian.config -import pace.dsl.stencil # noqa: F401 +import ndsl.dsl.stencil # noqa: F401 +from ndsl.util.null_comm import NullComm from pace.fv3core._config import DynamicalCoreConfig -from pace.util.null_comm import NullComm try: diff --git a/fv3core/examples/standalone/runfile/dynamics.py b/fv3core/examples/standalone/runfile/dynamics.py index dde65b06..68e37496 100755 --- a/fv3core/examples/standalone/runfile/dynamics.py +++ b/fv3core/examples/standalone/runfile/dynamics.py @@ -15,20 +15,20 @@ from mpi4py import MPI # NOTE: we need to import dsl.stencil prior to -# pace.util, otherwise xarray precedes gt4py, causing +# ndsl.util, otherwise xarray precedes gt4py, causing # very strange errors on some systems (e.g. daint) -import pace.dsl.stencil -import pace.util as util -from pace.dsl import StencilFactory -from pace.dsl.dace.orchestration import DaceConfig +import ndsl.dsl.stencil +import ndsl.util as util +from ndsl.dsl import StencilFactory +from ndsl.dsl.dace.orchestration import DaceConfig +from ndsl.stencils.testing import dataset_to_dict +from ndsl.stencils.testing.grid import Grid +from ndsl.util.grid import DampingCoefficients, GridData, MetricTerms +from ndsl.util.null_comm import NullComm from pace.fv3core import DynamicalCore, DynamicalCoreConfig from pace.fv3core.dycore_state import DycoreState from pace.fv3core.initialization.baroclinic import init_baroclinic_state from pace.fv3core.testing import TranslateFVDynamics -from pace.stencils.testing import dataset_to_dict -from pace.stencils.testing.grid import Grid -from pace.util.grid import DampingCoefficients, GridData, MetricTerms -from pace.util.null_comm import NullComm def parse_args() -> Namespace: @@ -222,8 +222,8 @@ def setup_dycore( tile_nx=dycore_config.npx, tile_nz=dycore_config.npz, ) - stencil_config = pace.dsl.stencil.StencilConfig( - compilation_config=pace.dsl.stencil.CompilationConfig( + stencil_config = ndsl.dsl.stencil.StencilConfig( + compilation_config=ndsl.dsl.stencil.CompilationConfig( backend=backend, rebuild=False, validate_args=False ), dace_config=dace_config, diff --git a/fv3core/pace/fv3core/_config.py b/fv3core/pace/fv3core/_config.py index e2f5c1f5..a3164c82 100644 --- a/fv3core/pace/fv3core/_config.py +++ b/fv3core/pace/fv3core/_config.py @@ -3,7 +3,7 @@ import f90nml -from pace.util import Namelist, NamelistDefaults +from ndsl.util import Namelist, NamelistDefaults DEFAULT_INT = 0 @@ -65,7 +65,6 @@ class RiemannConfig: @dataclasses.dataclass(frozen=True) class DGridShallowWaterLagrangianDynamicsConfig: - dddmp: float d2_bg: float d2_bg_k1: float @@ -92,7 +91,6 @@ class DGridShallowWaterLagrangianDynamicsConfig: @dataclasses.dataclass(frozen=True) class AcousticDynamicsConfig: - tau: float k_split: int n_split: int diff --git a/fv3core/pace/fv3core/dycore_state.py b/fv3core/pace/fv3core/dycore_state.py index 0f73e728..85d22ba1 100644 --- a/fv3core/pace/fv3core/dycore_state.py +++ b/fv3core/pace/fv3core/dycore_state.py @@ -3,269 +3,269 @@ import xarray as xr -import pace.dsl.gt4py_utils as gt_utils -import pace.util -from pace.dsl.typing import Float -from pace.util.quantity import Quantity +import ndsl.dsl.gt4py_utils as gt_utils +import ndsl.util +from ndsl.dsl.typing import Float +from ndsl.util.quantity import Quantity @dataclass() class DycoreState: - u: pace.util.Quantity = field( + u: ndsl.util.Quantity = field( metadata={ "name": "x_wind", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM, ndsl.util.Z_DIM], "units": "m/s", "intent": "inout", } ) - v: pace.util.Quantity = field( + v: ndsl.util.Quantity = field( metadata={ "name": "y_wind", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", "intent": "inout", } ) - w: pace.util.Quantity = field( + w: ndsl.util.Quantity = field( metadata={ "name": "vertical_wind", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", "intent": "inout", } ) # TODO: move a-grid winds to temporary internal storage - ua: pace.util.Quantity = field( + ua: ndsl.util.Quantity = field( metadata={ "name": "eastward_wind", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", "intent": "inout", } ) - va: pace.util.Quantity = field( + va: ndsl.util.Quantity = field( metadata={ "name": "northward_wind", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", } ) - uc: pace.util.Quantity = field( + uc: ndsl.util.Quantity = field( metadata={ "name": "x_wind_on_c_grid", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", "intent": "inout", } ) - vc: pace.util.Quantity = field( + vc: ndsl.util.Quantity = field( metadata={ "name": "y_wind_on_c_grid", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM, ndsl.util.Z_DIM], "units": "m/s", "intent": "inout", } ) - delp: pace.util.Quantity = field( + delp: ndsl.util.Quantity = field( metadata={ "name": "pressure_thickness_of_atmospheric_layer", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "Pa", "intent": "inout", } ) - delz: pace.util.Quantity = field( + delz: ndsl.util.Quantity = field( metadata={ "name": "vertical_thickness_of_atmospheric_layer", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m", "intent": "inout", } ) - ps: pace.util.Quantity = field( + ps: ndsl.util.Quantity = field( metadata={ "name": "surface_pressure", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "Pa", "intent": "inout", } ) - pe: pace.util.Quantity = field( + pe: ndsl.util.Quantity = field( metadata={ "name": "interface_pressure", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_INTERFACE_DIM], "units": "Pa", "n_halo": 1, "intent": "inout", } ) - pt: pace.util.Quantity = field( + pt: ndsl.util.Quantity = field( metadata={ "name": "air_temperature", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "degK", "intent": "inout", } ) - peln: pace.util.Quantity = field( + peln: ndsl.util.Quantity = field( metadata={ "name": "logarithm_of_interface_pressure", "dims": [ - pace.util.X_DIM, - pace.util.Y_DIM, - pace.util.Z_INTERFACE_DIM, + ndsl.util.X_DIM, + ndsl.util.Y_DIM, + ndsl.util.Z_INTERFACE_DIM, ], "units": "ln(Pa)", "n_halo": 0, "intent": "inout", } ) - pk: pace.util.Quantity = field( + pk: ndsl.util.Quantity = field( metadata={ "name": "interface_pressure_raised_to_power_of_kappa", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_INTERFACE_DIM], "units": "unknown", "n_halo": 0, "intent": "inout", } ) - pkz: pace.util.Quantity = field( + pkz: ndsl.util.Quantity = field( metadata={ "name": "layer_mean_pressure_raised_to_power_of_kappa", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "unknown", "n_halo": 0, "intent": "inout", } ) - qvapor: pace.util.Quantity = field( + qvapor: ndsl.util.Quantity = field( metadata={ "name": "specific_humidity", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", } ) - qliquid: pace.util.Quantity = field( + qliquid: ndsl.util.Quantity = field( metadata={ "name": "cloud_water_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - qice: pace.util.Quantity = field( + qice: ndsl.util.Quantity = field( metadata={ "name": "cloud_ice_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - qrain: pace.util.Quantity = field( + qrain: ndsl.util.Quantity = field( metadata={ "name": "rain_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - qsnow: pace.util.Quantity = field( + qsnow: ndsl.util.Quantity = field( metadata={ "name": "snow_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - qgraupel: pace.util.Quantity = field( + qgraupel: ndsl.util.Quantity = field( metadata={ "name": "graupel_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - qo3mr: pace.util.Quantity = field( + qo3mr: ndsl.util.Quantity = field( metadata={ "name": "ozone_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - qsgs_tke: pace.util.Quantity = field( + qsgs_tke: ndsl.util.Quantity = field( metadata={ "name": "turbulent_kinetic_energy", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m**2/s**2", "intent": "inout", } ) - qcld: pace.util.Quantity = field( + qcld: ndsl.util.Quantity = field( metadata={ "name": "cloud_fraction", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "", "intent": "inout", } ) - q_con: pace.util.Quantity = field( + q_con: ndsl.util.Quantity = field( metadata={ "name": "total_condensate_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - omga: pace.util.Quantity = field( + omga: ndsl.util.Quantity = field( metadata={ "name": "vertical_pressure_velocity", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "Pa/s", "intent": "inout", } ) - mfxd: pace.util.Quantity = field( + mfxd: ndsl.util.Quantity = field( metadata={ "name": "accumulated_x_mass_flux", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "unknown", "n_halo": 0, "intent": "inout", } ) - mfyd: pace.util.Quantity = field( + mfyd: ndsl.util.Quantity = field( metadata={ "name": "accumulated_y_mass_flux", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM, ndsl.util.Z_DIM], "units": "unknown", "n_halo": 0, "intent": "inout", } ) - cxd: pace.util.Quantity = field( + cxd: ndsl.util.Quantity = field( metadata={ "name": "accumulated_x_courant_number", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "", "n_halo": (0, 3), "intent": "inout", } ) - cyd: pace.util.Quantity = field( + cyd: ndsl.util.Quantity = field( metadata={ "name": "accumulated_y_courant_number", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM, ndsl.util.Z_DIM], "units": "", "n_halo": (3, 0), "intent": "inout", } ) - diss_estd: pace.util.Quantity = field( + diss_estd: ndsl.util.Quantity = field( metadata={ "name": "dissipation_estimate_from_heat_source", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "unknown", "n_halo": (3, 3), "intent": "inout", @@ -275,11 +275,11 @@ class DycoreState: how much energy is dissipated, is mainly captured to send to the stochastic physics (in contrast to heat_source) """ - phis: pace.util.Quantity = field( + phis: ndsl.util.Quantity = field( metadata={ "name": "surface_geopotential", "units": "m^2 s^-2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "intent": "in", } ) @@ -301,7 +301,7 @@ def __post_init__(self): ) @classmethod - def init_zeros(cls, quantity_factory: pace.util.QuantityFactory): + def init_zeros(cls, quantity_factory: ndsl.util.QuantityFactory): initial_storages = {} for _field in fields(cls): if "dims" in _field.metadata.keys(): @@ -316,7 +316,7 @@ def init_zeros(cls, quantity_factory: pace.util.QuantityFactory): @classmethod def init_from_numpy_arrays( - cls, dict_of_numpy_arrays, sizer: pace.util.GridSizer, backend: str + cls, dict_of_numpy_arrays, sizer: ndsl.util.GridSizer, backend: str ): field_names = [_field.name for _field in fields(cls)] for variable_name in dict_of_numpy_arrays.keys(): @@ -328,7 +328,7 @@ def init_from_numpy_arrays( for _field in fields(cls): if "dims" in _field.metadata.keys(): dims = _field.metadata["dims"] - dict_state[_field.name] = pace.util.Quantity( + dict_state[_field.name] = ndsl.util.Quantity( dict_of_numpy_arrays[_field.name], dims, _field.metadata["units"], @@ -343,7 +343,7 @@ def init_from_numpy_arrays( def init_from_storages( cls, storages: Mapping[str, Any], - sizer: pace.util.GridSizer, + sizer: ndsl.util.GridSizer, bdt: float = 0.0, mdt: float = 0.0, ): @@ -351,7 +351,7 @@ def init_from_storages( for _field in fields(cls): if "dims" in _field.metadata.keys(): dims = _field.metadata["dims"] - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( storages[_field.name], dims, _field.metadata["units"], @@ -365,11 +365,11 @@ def init_from_storages( def from_fortran_restart( cls, *, - quantity_factory: pace.util.QuantityFactory, - communicator: pace.util.Communicator, + quantity_factory: ndsl.util.QuantityFactory, + communicator: ndsl.util.Communicator, path: str, ): - state_dict: Mapping[str, pace.util.Quantity] = pace.util.open_restart( + state_dict: Mapping[str, ndsl.util.Quantity] = ndsl.util.open_restart( dirname=path, communicator=communicator, tracer_properties=TRACER_PROPERTIES, @@ -434,7 +434,7 @@ def from_fortran_restart( def xr_dataset(self): data_vars = {} for name, field_info in self.__dataclass_fields__.items(): - if issubclass(field_info.type, pace.util.Quantity): + if issubclass(field_info.type, ndsl.util.Quantity): dims = [ f"{dim_name}_{name}" for dim_name in field_info.metadata["dims"] ] @@ -460,47 +460,47 @@ def as_dict(self, quantity_only=True) -> Dict[str, Union[Quantity, int]]: TRACER_PROPERTIES = { "specific_humidity": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "restart_name": "sphum", "units": "g/kg", }, "cloud_liquid_water_mixing_ratio": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "restart_name": "liq_wat", "units": "g/kg", }, "cloud_ice_mixing_ratio": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "restart_name": "ice_wat", "units": "g/kg", }, "rain_mixing_ratio": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "restart_name": "rainwat", "units": "g/kg", }, "snow_mixing_ratio": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "restart_name": "snowwat", "units": "g/kg", }, "graupel_mixing_ratio": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "restart_name": "graupel", "units": "g/kg", }, "ozone_mixing_ratio": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "restart_name": "o3mr", "units": "g/kg", }, "turbulent_kinetic_energy": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "restart_name": "sgs_tke", "units": "g/kg", }, "cloud_fraction": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "restart_name": "cld_amt", "units": "g/kg", }, diff --git a/fv3core/pace/fv3core/initialization/analytic_init.py b/fv3core/pace/fv3core/initialization/analytic_init.py index 544c6283..a0435d8d 100644 --- a/fv3core/pace/fv3core/initialization/analytic_init.py +++ b/fv3core/pace/fv3core/initialization/analytic_init.py @@ -1,9 +1,9 @@ from enum import Enum -import pace.util as fv3util +import ndsl.util as fv3util +from ndsl.util import MetaEnumStr +from ndsl.util.grid import GridData from pace.fv3core.dycore_state import DycoreState -from pace.util import MetaEnumStr -from pace.util.grid import GridData class Cases(Enum, metaclass=MetaEnumStr): @@ -34,8 +34,8 @@ def init_analytic_state( Returns: an instance of DycoreState class """ - if analytic_init_case in Cases: - if analytic_init_case == Cases.baroclinic.value: + if analytic_init_case in Cases: # type: ignore + if analytic_init_case == Cases.baroclinic.value: # type: ignore import pace.fv3core.initialization.test_cases.initialize_baroclinic as bc assert isinstance(comm, fv3util.CubedSphereCommunicator) @@ -49,7 +49,7 @@ def init_analytic_state( comm=comm, ) - elif analytic_init_case == Cases.tropicalcyclone.value: + elif analytic_init_case == Cases.tropicalcyclone.value: # type: ignore import pace.fv3core.initialization.test_cases.initialize_tc as tc assert isinstance(comm, fv3util.CubedSphereCommunicator) diff --git a/fv3core/pace/fv3core/initialization/init_utils.py b/fv3core/pace/fv3core/initialization/init_utils.py index 42252e87..34609b82 100644 --- a/fv3core/pace/fv3core/initialization/init_utils.py +++ b/fv3core/pace/fv3core/initialization/init_utils.py @@ -4,12 +4,12 @@ import numpy as np -import pace.util as fv3util -import pace.util.constants as constants -from pace.dsl.typing import Float +import ndsl.util as fv3util +import ndsl.util.constants as constants +from ndsl.dsl.typing import Float +from ndsl.util.grid import lon_lat_midpoint +from ndsl.util.grid.gnomonic import get_lonlat_vect, get_unit_vector_direction from pace.fv3core.dycore_state import DycoreState -from pace.util.grid import lon_lat_midpoint -from pace.util.grid.gnomonic import get_lonlat_vect, get_unit_vector_direction # maximum windspeed amplitude - close to windspeed of zonal-mean time-mean @@ -128,7 +128,6 @@ def empty_numpy_dycore_state(shape): def _find_midpoint_unit_vectors(p1, p2): - midpoint = np.array( lon_lat_midpoint(p1[:, :, 0], p2[:, :, 0], p1[:, :, 1], p2[:, :, 1], np) ).transpose([1, 2, 0]) diff --git a/fv3core/pace/fv3core/initialization/test_cases/initialize_baroclinic.py b/fv3core/pace/fv3core/initialization/test_cases/initialize_baroclinic.py index c3fa1de9..7f93cfdc 100644 --- a/fv3core/pace/fv3core/initialization/test_cases/initialize_baroclinic.py +++ b/fv3core/pace/fv3core/initialization/test_cases/initialize_baroclinic.py @@ -2,12 +2,12 @@ import numpy as np -import pace.dsl.gt4py_utils as utils +import ndsl.dsl.gt4py_utils as utils +import ndsl.util as fv3util +import ndsl.util.constants as constants import pace.fv3core.initialization.init_utils as init_utils -import pace.util as fv3util -import pace.util.constants as constants +from ndsl.util.grid import GridData, great_circle_distance_lon_lat, lon_lat_midpoint from pace.fv3core.dycore_state import DycoreState -from pace.util.grid import GridData, great_circle_distance_lon_lat, lon_lat_midpoint # maximum windspeed amplitude - close to windspeed of zonal-mean time-mean diff --git a/fv3core/pace/fv3core/initialization/test_cases/initialize_tc.py b/fv3core/pace/fv3core/initialization/test_cases/initialize_tc.py index 33689344..d7590a99 100644 --- a/fv3core/pace/fv3core/initialization/test_cases/initialize_tc.py +++ b/fv3core/pace/fv3core/initialization/test_cases/initialize_tc.py @@ -1,14 +1,13 @@ import numpy as np +import ndsl.util as fv3util +import ndsl.util.constants as constants import pace.fv3core.initialization.init_utils as init_utils -import pace.util as fv3util -import pace.util.constants as constants +from ndsl.util.grid import GridData, great_circle_distance_lon_lat from pace.fv3core.dycore_state import DycoreState -from pace.util.grid import GridData, great_circle_distance_lon_lat def _calculate_distance_from_tc_center(pe_v, ps_v, muv, calc, tc_properties): - d1 = np.sin(calc["p0"][1]) * np.cos(muv["midpoint"][:, :, 1]) - np.cos( calc["p0"][1] ) * np.sin(muv["midpoint"][:, :, 1]) * np.cos( @@ -37,7 +36,6 @@ def _calculate_distance_from_tc_center(pe_v, ps_v, muv, calc, tc_properties): def _calculate_pt_height(height, qvapor, r, tc_properties, calc): - aa = height / tc_properties["zp"] bb = np.exp(aa ** tc_properties["exppz"]) cc = r / tc_properties["rp"] @@ -54,7 +52,6 @@ def _calculate_pt_height(height, qvapor, r, tc_properties, calc): def _calculate_utmp(height, dist, calc, tc_properties): - aa = height / tc_properties["zp"] # (134, 135, 79) bb = dist["r"] / tc_properties["rp"] # (134, 135) cc = aa ** tc_properties["exppz"] # (134, 135, 79) @@ -322,7 +319,6 @@ def _initialize_vortex_ps_phis(grid_data, shape, tc_properties, calc): def _initialize_qvapor_temperature(grid_data, pe, ps, tc_properties, calc, shape): - qvapor = np.zeros(shape) pt = np.zeros(shape) height = np.zeros(shape) @@ -407,7 +403,6 @@ def _initialize_wind_dgrid( def _interpolate_winds_dgrid_agrid(grid_data, ud, vd, tc_properties, shape): - ua = np.zeros(shape) va = np.zeros(shape) if tc_properties["vort"] is True: @@ -468,7 +463,6 @@ def _some_inital_calculations(tc_properties): def _initialize_delz_w(pe, ps, pt, qvapor, tc_properties, calc, shape): - delz = np.zeros(shape) w = np.zeros(shape) delz[:, :, :-1] = ( diff --git a/fv3core/pace/fv3core/stencils/a2b_ord4.py b/fv3core/pace/fv3core/stencils/a2b_ord4.py index b4a74898..31b6b8b1 100644 --- a/fv3core/pace/fv3core/stencils/a2b_ord4.py +++ b/fv3core/pace/fv3core/stencils/a2b_ord4.py @@ -11,13 +11,13 @@ sqrt, ) -import pace.util -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import GridIndexing, StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldI, FloatFieldIJ +import ndsl.util +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import GridIndexing, StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldI, FloatFieldIJ +from ndsl.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM +from ndsl.util.grid import GridData from pace.fv3core.stencils.basic_operations import copy_defn -from pace.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM -from pace.util.grid import GridData # comact 4-pt cubic interpolation @@ -534,7 +534,7 @@ class AGrid2BGridFourthOrder: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, grid_data: GridData, grid_type: int, z_dim=Z_DIM, diff --git a/fv3core/pace/fv3core/stencils/basic_operations.py b/fv3core/pace/fv3core/stencils/basic_operations.py index 85d86ad3..55307c5c 100644 --- a/fv3core/pace/fv3core/stencils/basic_operations.py +++ b/fv3core/pace/fv3core/stencils/basic_operations.py @@ -1,7 +1,7 @@ import gt4py.cartesian.gtscript as gtscript from gt4py.cartesian.gtscript import PARALLEL, computation, interval -from pace.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ def copy_defn(q_in: FloatField, q_out: FloatField): diff --git a/fv3core/pace/fv3core/stencils/c_sw.py b/fv3core/pace/fv3core/stencils/c_sw.py index e74b9319..5759a57a 100644 --- a/fv3core/pace/fv3core/stencils/c_sw.py +++ b/fv3core/pace/fv3core/stencils/c_sw.py @@ -7,14 +7,14 @@ region, ) -import pace.util -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ +import ndsl.util +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.stencils import corners +from ndsl.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM +from ndsl.util.grid import GridData from pace.fv3core.stencils.d2a2c_vect import DGrid2AGrid2CGridVectors -from pace.stencils import corners -from pace.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM -from pace.util.grid import GridData def zero_delpc_ptc(delpc: FloatField, ptc: FloatField): @@ -507,7 +507,7 @@ class CGridShallowWaterDynamics: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, grid_data: GridData, nested: bool, grid_type: int, @@ -552,7 +552,7 @@ def __init__( dord4=self._dord4, ) - def make_quantity() -> pace.util.Quantity: + def make_quantity() -> ndsl.util.Quantity: return quantity_factory.zeros( [X_DIM, Y_DIM, Z_DIM], units="unknown", diff --git a/fv3core/pace/fv3core/stencils/d2a2c_vect.py b/fv3core/pace/fv3core/stencils/d2a2c_vect.py index 1b3e4d33..70c14970 100644 --- a/fv3core/pace/fv3core/stencils/d2a2c_vect.py +++ b/fv3core/pace/fv3core/stencils/d2a2c_vect.py @@ -1,14 +1,14 @@ import gt4py.cartesian.gtscript as gtscript from gt4py.cartesian.gtscript import PARALLEL, computation, horizontal, interval, region -import pace.util -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ +import ndsl.util +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.stencils import corners +from ndsl.util import X_DIM, Y_DIM, Z_DIM +from ndsl.util.grid import GridData from pace.fv3core.stencils.a2b_ord4 import a1, a2, lagrange_x_func, lagrange_y_func -from pace.stencils import corners -from pace.util import X_DIM, Y_DIM, Z_DIM -from pace.util.grid import GridData c1 = -2.0 / 14.0 @@ -385,7 +385,7 @@ class DGrid2AGrid2CGridVectors: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, grid_data: GridData, nested: bool, grid_type: int, diff --git a/fv3core/pace/fv3core/stencils/d_sw.py b/fv3core/pace/fv3core/stencils/d_sw.py index 319054b6..d2c8a701 100644 --- a/fv3core/pace/fv3core/stencils/d_sw.py +++ b/fv3core/pace/fv3core/stencils/d_sw.py @@ -10,11 +10,13 @@ region, ) +import ndsl.util import pace.fv3core.stencils.delnflux as delnflux -import pace.util -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ, FloatFieldK +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ, FloatFieldK +from ndsl.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM +from ndsl.util.grid import DampingCoefficients, GridData from pace.fv3core._config import DGridShallowWaterLagrangianDynamicsConfig from pace.fv3core.stencils.d2a2c_vect import contravariant from pace.fv3core.stencils.delnflux import DelnFluxNoSG @@ -23,8 +25,6 @@ from pace.fv3core.stencils.fxadv import FiniteVolumeFluxPrep from pace.fv3core.stencils.xtp_u import advect_u_along_x from pace.fv3core.stencils.ytp_v import advect_v_along_y -from pace.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM -from pace.util.grid import DampingCoefficients, GridData dcon_threshold = 1e-5 @@ -624,7 +624,7 @@ def update_u_and_v( # Set the unique parameters for the smallest # k-values, e.g. k = 0, 1, 2 when generating # the column namelist -def set_low_kvals(col: Mapping[str, pace.util.Quantity], k): +def set_low_kvals(col: Mapping[str, ndsl.util.Quantity], k): for name in ["nord", "nord_w", "d_con"]: col[name].view[k] = 0 col["damp_w"].view[k] = col["d2_divg"].view[k] @@ -645,7 +645,7 @@ def lowest_kvals(column, k, do_vort_damp): def get_column_namelist( config: DGridShallowWaterLagrangianDynamicsConfig, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, ): """ Generate a dictionary of columns that specify how parameters (such as nord, damp) @@ -662,7 +662,7 @@ def get_column_namelist( "damp_t", "d2_divg", ] - col: Dict[str, pace.util.Quantity] = {} + col: Dict[str, ndsl.util.Quantity] = {} for name in all_names: # TODO: fill units information col[name] = quantity_factory.zeros( @@ -748,7 +748,7 @@ class DGridShallowWaterLagrangianDynamics: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, grid_data: GridData, damping_coefficients: DampingCoefficients, column_namelist, diff --git a/fv3core/pace/fv3core/stencils/del2cubed.py b/fv3core/pace/fv3core/stencils/del2cubed.py index d4676eac..2af8a127 100644 --- a/fv3core/pace/fv3core/stencils/del2cubed.py +++ b/fv3core/pace/fv3core/stencils/del2cubed.py @@ -1,13 +1,13 @@ from gt4py.cartesian.gtscript import PARALLEL, computation, horizontal, interval, region -import pace.stencils.corners as corners -import pace.util -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory, get_stencils_with_varied_bounds -from pace.dsl.typing import Float, FloatField, FloatFieldIJ, cast_to_index3d +import ndsl.stencils.corners as corners +import ndsl.util +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory, get_stencils_with_varied_bounds +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ, cast_to_index3d +from ndsl.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM +from ndsl.util.grid import DampingCoefficients from pace.fv3core.stencils.basic_operations import copy_defn -from pace.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM -from pace.util.grid import DampingCoefficients # @@ -83,7 +83,7 @@ class HyperdiffusionDamping: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, damping_coefficients: DampingCoefficients, rarea, nmax: int, diff --git a/fv3core/pace/fv3core/stencils/delnflux.py b/fv3core/pace/fv3core/stencils/delnflux.py index 898a8a7f..48cfd285 100644 --- a/fv3core/pace/fv3core/stencils/delnflux.py +++ b/fv3core/pace/fv3core/stencils/delnflux.py @@ -10,24 +10,24 @@ region, ) -import pace.util -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory, get_stencils_with_varied_bounds -from pace.dsl.typing import Float, FloatField, FloatFieldIJ, FloatFieldK -from pace.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM -from pace.util.grid import DampingCoefficients +import ndsl.util +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory, get_stencils_with_varied_bounds +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ, FloatFieldK +from ndsl.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM +from ndsl.util.grid import DampingCoefficients def calc_damp( - damp_c: pace.util.Quantity, da_min: Float, nord: pace.util.Quantity -) -> pace.util.Quantity: + damp_c: ndsl.util.Quantity, da_min: Float, nord: ndsl.util.Quantity +) -> ndsl.util.Quantity: if damp_c.dims != nord.dims or damp_c.data.shape != nord.data.shape: raise NotImplementedError( "current implementation requires damp_c and nord to have " "identical data shape and dims" ) data = (damp_c.data * da_min) ** (nord.data + 1) - return pace.util.Quantity( + return ndsl.util.Quantity( data=data, dims=damp_c.dims, # TODO: find and document units @@ -953,11 +953,11 @@ class DelnFlux: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, damping_coefficients: DampingCoefficients, - rarea: pace.util.Quantity, - nord_col: pace.util.Quantity, - damp_c: pace.util.Quantity, + rarea: ndsl.util.Quantity, + nord_col: ndsl.util.Quantity, + damp_c: ndsl.util.Quantity, ): """ nord sets the order of damping to apply: @@ -1074,8 +1074,8 @@ def __init__( self, stencil_factory: StencilFactory, damping_coefficients: DampingCoefficients, - rarea: pace.util.Quantity, - nord: pace.util.Quantity, + rarea: ndsl.util.Quantity, + nord: ndsl.util.Quantity, nk: Optional[int] = None, ): """ diff --git a/fv3core/pace/fv3core/stencils/divergence_damping.py b/fv3core/pace/fv3core/stencils/divergence_damping.py index 5c63175a..380b5bdd 100644 --- a/fv3core/pace/fv3core/stencils/divergence_damping.py +++ b/fv3core/pace/fv3core/stencils/divergence_damping.py @@ -9,19 +9,19 @@ sqrt, ) +import ndsl.stencils.corners as corners +import ndsl.util import pace.fv3core.stencils.basic_operations as basic -import pace.stencils.corners as corners -import pace.util -from pace.dsl.dace.orchestration import dace_inhibitor, orchestrate -from pace.dsl.stencil import StencilFactory, get_stencils_with_varied_bounds -from pace.dsl.typing import Float, FloatField, FloatFieldIJ, FloatFieldK +from ndsl.dsl.dace.orchestration import dace_inhibitor, orchestrate +from ndsl.dsl.stencil import StencilFactory, get_stencils_with_varied_bounds +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ, FloatFieldK +from ndsl.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM +from ndsl.util.grid import DampingCoefficients, GridData from pace.fv3core.stencils.a2b_ord4 import ( AGrid2BGridFourthOrder, doubly_periodic_a2b_ord4, ) from pace.fv3core.stencils.d2a2c_vect import contravariant -from pace.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM -from pace.util.grid import DampingCoefficients, GridData @gtscript.function @@ -307,7 +307,7 @@ class DivergenceDamping: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, grid_data: GridData, damping_coefficients: DampingCoefficients, nested: bool, @@ -316,7 +316,7 @@ def __init__( d4_bg, nord: int, grid_type, - nord_col: pace.util.Quantity, + nord_col: ndsl.util.Quantity, d2_bg: FloatFieldK, ): orchestrate( diff --git a/fv3core/pace/fv3core/stencils/dyn_core.py b/fv3core/pace/fv3core/stencils/dyn_core.py index 45173c80..0ac617c1 100644 --- a/fv3core/pace/fv3core/stencils/dyn_core.py +++ b/fv3core/pace/fv3core/stencils/dyn_core.py @@ -12,6 +12,9 @@ region, ) +import ndsl.util +import ndsl.util as fv3util +import ndsl.util.constants as constants import pace.fv3core.stencils.basic_operations as basic import pace.fv3core.stencils.d_sw as d_sw import pace.fv3core.stencils.nh_p_grad as nh_p_grad @@ -20,21 +23,11 @@ import pace.fv3core.stencils.temperature_adjust as temperature_adjust import pace.fv3core.stencils.updatedzc as updatedzc import pace.fv3core.stencils.updatedzd as updatedzd -import pace.util -import pace.util as fv3util -import pace.util.constants as constants -from pace.dsl.dace.orchestration import dace_inhibitor, orchestrate -from pace.dsl.dace.wrapped_halo_exchange import WrappedHaloUpdater -from pace.dsl.stencil import GridIndexing, StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ -from pace.fv3core._config import AcousticDynamicsConfig -from pace.fv3core.dycore_state import DycoreState -from pace.fv3core.stencils.c_sw import CGridShallowWaterDynamics -from pace.fv3core.stencils.del2cubed import HyperdiffusionDamping -from pace.fv3core.stencils.pk3_halo import PK3Halo -from pace.fv3core.stencils.riem_solver3 import NonhydrostaticVerticalSolver -from pace.fv3core.stencils.riem_solver_c import NonhydrostaticVerticalSolverCGrid -from pace.util import ( +from ndsl.dsl.dace.orchestration import dace_inhibitor, orchestrate +from ndsl.dsl.dace.wrapped_halo_exchange import WrappedHaloUpdater +from ndsl.dsl.stencil import GridIndexing, StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.util import ( X_DIM, X_INTERFACE_DIM, Y_DIM, @@ -42,7 +35,14 @@ Z_DIM, Z_INTERFACE_DIM, ) -from pace.util.grid import DampingCoefficients, GridData +from ndsl.util.grid import DampingCoefficients, GridData +from pace.fv3core._config import AcousticDynamicsConfig +from pace.fv3core.dycore_state import DycoreState +from pace.fv3core.stencils.c_sw import CGridShallowWaterDynamics +from pace.fv3core.stencils.del2cubed import HyperdiffusionDamping +from pace.fv3core.stencils.pk3_halo import PK3Halo +from pace.fv3core.stencils.riem_solver3 import NonhydrostaticVerticalSolver +from pace.fv3core.stencils.riem_solver_c import NonhydrostaticVerticalSolverCGrid HUGE_R = 1.0e40 @@ -190,9 +190,9 @@ def get_nk_heat_dissipation( def dyncore_temporaries( - quantity_factory: pace.util.QuantityFactory, -) -> Mapping[str, pace.util.Quantity]: - temporaries: Dict[str, pace.util.Quantity] = {} + quantity_factory: ndsl.util.QuantityFactory, +) -> Mapping[str, ndsl.util.Quantity]: + temporaries: Dict[str, ndsl.util.Quantity] = {} for name in ["ut", "vt", "gz", "zh", "pem", "pkc", "pk3", "heat_source", "cappa"]: # TODO: the dimensions of ut and vt may not be correct, # because they are not used. double-check and correct as needed. @@ -243,16 +243,16 @@ class _HaloUpdaters(object): def __init__( self, - comm: pace.util.Communicator, + comm: ndsl.util.Communicator, grid_indexing: GridIndexing, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, state: DycoreState, - cappa: pace.util.Quantity, - gz: pace.util.Quantity, - zh: pace.util.Quantity, - divgd: pace.util.Quantity, - heat_source: pace.util.Quantity, - pkc: pace.util.Quantity, + cappa: ndsl.util.Quantity, + gz: ndsl.util.Quantity, + zh: ndsl.util.Quantity, + divgd: ndsl.util.Quantity, + heat_source: ndsl.util.Quantity, + pkc: ndsl.util.Quantity, ): # Define the memory specification required # Those can be re-used as they are read-only descriptors @@ -364,9 +364,9 @@ def __init__( def __init__( self, - comm: pace.util.Communicator, + comm: ndsl.util.Communicator, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, grid_data: GridData, damping_coefficients: DampingCoefficients, grid_type, @@ -376,7 +376,7 @@ def __init__( phis: FloatFieldIJ, wsd: FloatFieldIJ, state, # [DaCe] hack to get around quantity as parameters for halo updates - checkpointer: Optional[pace.util.Checkpointer] = None, + checkpointer: Optional[ndsl.util.Checkpointer] = None, ): """ Args: @@ -424,7 +424,7 @@ def __init__( self.call_checkpointer = checkpointer is not None if checkpointer is None: - self.checkpointer: pace.util.Checkpointer = pace.util.NullCheckpointer() + self.checkpointer: ndsl.util.Checkpointer = ndsl.util.NullCheckpointer() else: self.checkpointer = checkpointer grid_indexing = stencil_factory.grid_indexing diff --git a/fv3core/pace/fv3core/stencils/fillz.py b/fv3core/pace/fv3core/stencils/fillz.py index 8079a202..c794716d 100644 --- a/fv3core/pace/fv3core/stencils/fillz.py +++ b/fv3core/pace/fv3core/stencils/fillz.py @@ -3,12 +3,12 @@ from gt4py.cartesian.gtscript import BACKWARD, FORWARD, PARALLEL, computation, interval -import pace.dsl.gt4py_utils as utils -import pace.util -from pace.dsl.dace import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ, IntFieldIJ -from pace.util import X_DIM, Y_DIM, Z_DIM +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +from ndsl.dsl.dace import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ, IntFieldIJ +from ndsl.util import X_DIM, Y_DIM, Z_DIM @typing.no_type_check @@ -118,9 +118,9 @@ class FillNegativeTracerValues: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, nq: int, - tracers: Dict[str, pace.util.Quantity], + tracers: Dict[str, ndsl.util.Quantity], ): orchestrate( obj=self, @@ -154,7 +154,7 @@ def __init__( def __call__( self, dp2: FloatField, - tracers: Dict[str, pace.util.Quantity], + tracers: Dict[str, ndsl.util.Quantity], ): """ Args: diff --git a/fv3core/pace/fv3core/stencils/fv_dynamics.py b/fv3core/pace/fv3core/stencils/fv_dynamics.py index d4ef8959..de20a0e5 100644 --- a/fv3core/pace/fv3core/stencils/fv_dynamics.py +++ b/fv3core/pace/fv3core/stencils/fv_dynamics.py @@ -4,13 +4,18 @@ from dace.frontend.python.interface import nounroll as dace_no_unroll from gt4py.cartesian.gtscript import PARALLEL, computation, interval -import pace.dsl.gt4py_utils as utils +import ndsl.dsl.gt4py_utils as utils +import ndsl.util import pace.fv3core.stencils.moist_cv as moist_cv -import pace.util -from pace.dsl.dace.orchestration import dace_inhibitor, orchestrate -from pace.dsl.dace.wrapped_halo_exchange import WrappedHaloUpdater -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField +from ndsl.dsl.dace.orchestration import dace_inhibitor, orchestrate +from ndsl.dsl.dace.wrapped_halo_exchange import WrappedHaloUpdater +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField +from ndsl.stencils.c2l_ord import CubedToLatLon +from ndsl.util import X_DIM, Y_DIM, Z_INTERFACE_DIM, Timer, constants +from ndsl.util.grid import DampingCoefficients, GridData +from ndsl.util.logging import pace_log +from ndsl.util.mpi import MPI from pace.fv3core._config import DynamicalCoreConfig from pace.fv3core.dycore_state import DycoreState from pace.fv3core.stencils import fvtp2d, tracer_2d_1l @@ -19,11 +24,6 @@ from pace.fv3core.stencils.dyn_core import AcousticDynamics from pace.fv3core.stencils.neg_adj3 import AdjustNegativeTracerMixingRatio from pace.fv3core.stencils.remapping import LagrangianToEulerian -from pace.stencils.c2l_ord import CubedToLatLon -from pace.util import X_DIM, Y_DIM, Z_INTERFACE_DIM, Timer, constants -from pace.util.grid import DampingCoefficients, GridData -from pace.util.logging import pace_log -from pace.util.mpi import MPI def pt_to_potential_density_pt( @@ -55,19 +55,19 @@ def omega_from_w(delp: FloatField, delz: FloatField, w: FloatField, omega: Float def fvdyn_temporaries( - quantity_factory: pace.util.QuantityFactory, -) -> Mapping[str, pace.util.Quantity]: + quantity_factory: ndsl.util.QuantityFactory, +) -> Mapping[str, ndsl.util.Quantity]: tmps = {} for name in ["te_2d", "te0_2d", "wsd"]: quantity = quantity_factory.zeros( - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="unknown", dtype=Float, ) tmps[name] = quantity for name in ["dp1", "cvm"]: quantity = quantity_factory.zeros( - dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], units="unknown", dtype=Float, ) @@ -89,16 +89,16 @@ class DynamicalCore: def __init__( self, - comm: pace.util.Communicator, + comm: ndsl.util.Communicator, grid_data: GridData, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, damping_coefficients: DampingCoefficients, config: DynamicalCoreConfig, - phis: pace.util.Quantity, + phis: ndsl.util.Quantity, state: DycoreState, timestep: timedelta, - checkpointer: Optional[pace.util.Checkpointer] = None, + checkpointer: Optional[ndsl.util.Checkpointer] = None, ): """ Args: @@ -180,7 +180,7 @@ def __init__( # have not implemented, so they are hard-coded here. self.call_checkpointer = checkpointer is not None if checkpointer is None: - self.checkpointer: pace.util.Checkpointer = pace.util.NullCheckpointer() + self.checkpointer: ndsl.util.Checkpointer = ndsl.util.NullCheckpointer() else: self.checkpointer = checkpointer nested = False @@ -318,7 +318,7 @@ def __init__( ) full_xyz_spec = quantity_factory.get_quantity_halo_spec( - dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], n_halo=grid_indexing.n_halo, dtype=Float, ) @@ -441,7 +441,7 @@ def _checkpoint_tracer_advection_out( def step_dynamics( self, state: DycoreState, - timer: Timer = pace.util.NullTimer(), + timer: Timer = ndsl.util.NullTimer(), ): """ Step the model state forward by one timestep. @@ -506,7 +506,7 @@ def compute_preamble(self, state: DycoreState, is_root_rank: bool): def __call__(self, *args, **kwargs): return self.step_dynamics(*args, **kwargs) - def _compute(self, state: DycoreState, timer: pace.util.Timer): + def _compute(self, state: DycoreState, timer: ndsl.util.Timer): last_step = False self.compute_preamble( state, diff --git a/fv3core/pace/fv3core/stencils/fv_subgridz.py b/fv3core/pace/fv3core/stencils/fv_subgridz.py index 908ba296..3d9b8e72 100644 --- a/fv3core/pace/fv3core/stencils/fv_subgridz.py +++ b/fv3core/pace/fv3core/stencils/fv_subgridz.py @@ -10,14 +10,12 @@ interval, ) -import pace.dsl.gt4py_utils as utils -import pace.util -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField -from pace.fv3core.dycore_state import DycoreState -from pace.fv3core.stencils.basic_operations import dim -from pace.util import X_DIM, Y_DIM, Z_DIM -from pace.util.constants import ( +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField +from ndsl.util import X_DIM, Y_DIM, Z_DIM +from ndsl.util.constants import ( C_ICE, C_LIQ, CP_AIR, @@ -28,6 +26,8 @@ RDGAS, ZVIR, ) +from pace.fv3core.dycore_state import DycoreState +from pace.fv3core.stencils.basic_operations import dim RK = CP_AIR / RDGAS + 1.0 @@ -776,7 +776,7 @@ class DryConvectiveAdjustment: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, nwat: int, fv_sg_adj: Float, n_sponge: int, @@ -855,8 +855,8 @@ def make_quantity(): def __call__( self, state: DycoreState, - u_dt: pace.util.Quantity, - v_dt: pace.util.Quantity, + u_dt: ndsl.util.Quantity, + v_dt: ndsl.util.Quantity, timestep: Float, ): """ diff --git a/fv3core/pace/fv3core/stencils/fvtp2d.py b/fv3core/pace/fv3core/stencils/fvtp2d.py index 3369bcab..e2eacde6 100644 --- a/fv3core/pace/fv3core/stencils/fvtp2d.py +++ b/fv3core/pace/fv3core/stencils/fvtp2d.py @@ -3,16 +3,16 @@ import gt4py.cartesian.gtscript as gtscript from gt4py.cartesian.gtscript import PARALLEL, computation, horizontal, interval, region -import pace.stencils.corners as corners -import pace.util -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ +import ndsl.stencils.corners as corners +import ndsl.util +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.util import X_DIM, Y_DIM, Z_DIM +from ndsl.util.grid import DampingCoefficients, GridData from pace.fv3core.stencils.delnflux import DelnFlux from pace.fv3core.stencils.xppm import XPiecewiseParabolic from pace.fv3core.stencils.yppm import YPiecewiseParabolic -from pace.util import X_DIM, Y_DIM, Z_DIM -from pace.util.grid import DampingCoefficients, GridData @gtscript.function @@ -129,7 +129,7 @@ class FiniteVolumeTransport: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, grid_data: GridData, damping_coefficients: DampingCoefficients, grid_type: int, diff --git a/fv3core/pace/fv3core/stencils/fxadv.py b/fv3core/pace/fv3core/stencils/fxadv.py index 1527c898..cf0e95ee 100644 --- a/fv3core/pace/fv3core/stencils/fxadv.py +++ b/fv3core/pace/fv3core/stencils/fxadv.py @@ -7,11 +7,11 @@ region, ) -from pace.dsl.dace import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.dsl.dace import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.util.grid import GridData from pace.fv3core.stencils.d2a2c_vect import contravariant -from pace.util.grid import GridData def main_uc_vc_contra( @@ -583,7 +583,7 @@ def __init__( ) # self._set_nans = get_set_nan_func( # grid_indexing, - # dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + # dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], # n_halo=((2, 2), (2, 2)), # ) diff --git a/fv3core/pace/fv3core/stencils/map_single.py b/fv3core/pace/fv3core/stencils/map_single.py index 1f439584..9a09fc5d 100644 --- a/fv3core/pace/fv3core/stencils/map_single.py +++ b/fv3core/pace/fv3core/stencils/map_single.py @@ -2,13 +2,13 @@ from gt4py.cartesian.gtscript import FORWARD, PARALLEL, computation, interval -import pace.util -from pace.dsl.dace import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ, IntFieldIJ # noqa: F401 +import ndsl.util +from ndsl.dsl.dace import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ, IntFieldIJ # noqa: F401 +from ndsl.util import X_DIM, Y_DIM, Z_DIM from pace.fv3core.stencils.basic_operations import copy_defn from pace.fv3core.stencils.remap_profile import RemapProfile -from pace.util import X_DIM, Y_DIM, Z_DIM def set_dp(dp1: FloatField, pe1: FloatField, lev: IntFieldIJ): @@ -89,7 +89,7 @@ class MapSingle: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, kord: int, mode: int, dims: Sequence[str], diff --git a/fv3core/pace/fv3core/stencils/mapn_tracer.py b/fv3core/pace/fv3core/stencils/mapn_tracer.py index c7c978f9..f4a3cca2 100644 --- a/fv3core/pace/fv3core/stencils/mapn_tracer.py +++ b/fv3core/pace/fv3core/stencils/mapn_tracer.py @@ -1,13 +1,13 @@ from typing import Dict -import pace.dsl.gt4py_utils as utils -import pace.util -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField +from ndsl.util import X_DIM, Y_DIM, Z_DIM from pace.fv3core.stencils.fillz import FillNegativeTracerValues from pace.fv3core.stencils.map_single import MapSingle -from pace.util import X_DIM, Y_DIM, Z_DIM class MapNTracer: @@ -18,11 +18,11 @@ class MapNTracer: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, kord: int, nq: int, fill: bool, - tracers: Dict[str, pace.util.Quantity], + tracers: Dict[str, ndsl.util.Quantity], ): orchestrate( obj=self, @@ -66,7 +66,7 @@ def __call__( pe1: FloatField, pe2: FloatField, dp2: FloatField, - tracers: Dict[str, pace.util.Quantity], + tracers: Dict[str, ndsl.util.Quantity], ): """ Remaps the tracer species onto the Eulerian grid diff --git a/fv3core/pace/fv3core/stencils/moist_cv.py b/fv3core/pace/fv3core/stencils/moist_cv.py index 2c8d698b..139fd16f 100644 --- a/fv3core/pace/fv3core/stencils/moist_cv.py +++ b/fv3core/pace/fv3core/stencils/moist_cv.py @@ -8,8 +8,8 @@ log, ) -import pace.util.constants as constants -from pace.dsl.typing import Float, FloatField +import ndsl.util.constants as constants +from ndsl.dsl.typing import Float, FloatField @gtscript.function diff --git a/fv3core/pace/fv3core/stencils/neg_adj3.py b/fv3core/pace/fv3core/stencils/neg_adj3.py index b6aa77ee..d706ad2e 100644 --- a/fv3core/pace/fv3core/stencils/neg_adj3.py +++ b/fv3core/pace/fv3core/stencils/neg_adj3.py @@ -1,11 +1,11 @@ import gt4py.cartesian.gtscript as gtscript from gt4py.cartesian.gtscript import BACKWARD, FORWARD, PARALLEL, computation, interval -import pace.util -import pace.util.constants as constants -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ -from pace.util import X_DIM, Y_DIM +import ndsl.util +import ndsl.util.constants as constants +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.util import X_DIM, Y_DIM ZVIR = constants.RVGAS / constants.RDGAS - 1.0 @@ -335,7 +335,7 @@ class AdjustNegativeTracerMixingRatio: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, check_negative: bool, hydrostatic: bool, ): diff --git a/fv3core/pace/fv3core/stencils/nh_p_grad.py b/fv3core/pace/fv3core/stencils/nh_p_grad.py index 5504ba2b..f3111d2c 100644 --- a/fv3core/pace/fv3core/stencils/nh_p_grad.py +++ b/fv3core/pace/fv3core/stencils/nh_p_grad.py @@ -1,12 +1,12 @@ from gt4py.cartesian.gtscript import PARALLEL, computation, interval -import pace.util -from pace.dsl.dace import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ +import ndsl.util +from ndsl.dsl.dace import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.util import X_DIM, Y_DIM, Z_INTERFACE_DIM +from ndsl.util.grid import GridData from pace.fv3core.stencils.a2b_ord4 import AGrid2BGridFourthOrder -from pace.util import X_DIM, Y_DIM, Z_INTERFACE_DIM -from pace.util.grid import GridData def set_k0_and_calc_wk( @@ -127,7 +127,7 @@ class NonHydrostaticPressureGradient: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, grid_data: GridData, grid_type, ): diff --git a/fv3core/pace/fv3core/stencils/pe_halo.py b/fv3core/pace/fv3core/stencils/pe_halo.py index e02ef01e..f728b7f1 100644 --- a/fv3core/pace/fv3core/stencils/pe_halo.py +++ b/fv3core/pace/fv3core/stencils/pe_halo.py @@ -1,6 +1,6 @@ from gt4py.cartesian.gtscript import FORWARD, computation, horizontal, interval, region -from pace.dsl.typing import Float, FloatField +from ndsl.dsl.typing import Float, FloatField def edge_pe(pe: FloatField, delp: FloatField, ptop: Float): diff --git a/fv3core/pace/fv3core/stencils/pk3_halo.py b/fv3core/pace/fv3core/stencils/pk3_halo.py index 17ddaba1..94ed031e 100644 --- a/fv3core/pace/fv3core/stencils/pk3_halo.py +++ b/fv3core/pace/fv3core/stencils/pk3_halo.py @@ -1,9 +1,9 @@ from gt4py.cartesian.gtscript import FORWARD, computation, horizontal, interval, region -import pace.util -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ -from pace.util import X_DIM, Y_DIM +import ndsl.util +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.util import X_DIM, Y_DIM # TODO merge with pe_halo? reuse partials? @@ -41,7 +41,7 @@ class PK3Halo: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, ): grid_indexing = stencil_factory.grid_indexing origin = grid_indexing.origin_full() diff --git a/fv3core/pace/fv3core/stencils/ppm.py b/fv3core/pace/fv3core/stencils/ppm.py index ee6a2f2d..e1e1fd2c 100644 --- a/fv3core/pace/fv3core/stencils/ppm.py +++ b/fv3core/pace/fv3core/stencils/ppm.py @@ -1,6 +1,6 @@ from gt4py.cartesian import gtscript -from pace.dsl.typing import FloatField +from ndsl.dsl.typing import FloatField # volume-conserving cubic with 2nd drv=0 at end point: diff --git a/fv3core/pace/fv3core/stencils/ray_fast.py b/fv3core/pace/fv3core/stencils/ray_fast.py index db0a410e..6fb79ed2 100644 --- a/fv3core/pace/fv3core/stencils/ray_fast.py +++ b/fv3core/pace/fv3core/stencils/ray_fast.py @@ -12,15 +12,16 @@ sin, ) -import pace.util.constants as constants -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldK -from pace.util import X_INTERFACE_DIM, Y_INTERFACE_DIM, Z_DIM +import ndsl.util.constants as constants +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldK +from ndsl.util import X_INTERFACE_DIM, Y_INTERFACE_DIM, Z_DIM SDAY = 86400.0 + # NOTE: The fortran version of this computes rf in the first timestep only. Then # rf_initialized let's you know you can skip it. Here we calculate it every # time. @@ -191,7 +192,6 @@ def __call__( dt: Float, ptop: Float, ): - rf_cutoff_nudge = self._rf_cutoff + min(100.0, 10.0 * ptop) self._ray_fast_wind_compute( diff --git a/fv3core/pace/fv3core/stencils/remap_profile.py b/fv3core/pace/fv3core/stencils/remap_profile.py index 563e9f19..4e0c8bb0 100644 --- a/fv3core/pace/fv3core/stencils/remap_profile.py +++ b/fv3core/pace/fv3core/stencils/remap_profile.py @@ -10,11 +10,11 @@ interval, ) -import pace.util -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import BoolField, Float, FloatField, FloatFieldIJ -from pace.util import X_DIM, Y_DIM, Z_DIM, Z_INTERFACE_DIM +import ndsl.util +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import BoolField, Float, FloatField, FloatFieldIJ +from ndsl.util import X_DIM, Y_DIM, Z_DIM, Z_INTERFACE_DIM @gtscript.function @@ -571,7 +571,7 @@ class RemapProfile: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, kord: int, iv: int, dims: Sequence[str], diff --git a/fv3core/pace/fv3core/stencils/remapping.py b/fv3core/pace/fv3core/stencils/remapping.py index 50f8c164..5d4e7fe6 100644 --- a/fv3core/pace/fv3core/stencils/remapping.py +++ b/fv3core/pace/fv3core/stencils/remapping.py @@ -13,18 +13,12 @@ region, ) +import ndsl.util import pace.fv3core.stencils.moist_cv as moist_cv -import pace.util -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ, FloatFieldK -from pace.fv3core._config import RemappingConfig -from pace.fv3core.stencils.basic_operations import adjust_divide_stencil -from pace.fv3core.stencils.map_single import MapSingle -from pace.fv3core.stencils.mapn_tracer import MapNTracer -from pace.fv3core.stencils.moist_cv import moist_pt_func, moist_pt_last_step -from pace.fv3core.stencils.saturation_adjustment import SatAdjust3d -from pace.util import ( +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ, FloatFieldK +from ndsl.util import ( X_DIM, X_INTERFACE_DIM, Y_DIM, @@ -33,6 +27,12 @@ Z_INTERFACE_DIM, Quantity, ) +from pace.fv3core._config import RemappingConfig +from pace.fv3core.stencils.basic_operations import adjust_divide_stencil +from pace.fv3core.stencils.map_single import MapSingle +from pace.fv3core.stencils.mapn_tracer import MapNTracer +from pace.fv3core.stencils.moist_cv import moist_pt_func, moist_pt_last_step +from pace.fv3core.stencils.saturation_adjustment import SatAdjust3d # TODO: Should this be set here or in global_constants? @@ -291,13 +291,13 @@ class LagrangianToEulerian: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, config: RemappingConfig, area_64, nq, pfull, tracers: Dict[str, Quantity], - checkpointer: Optional[pace.util.Checkpointer] = None, + checkpointer: Optional[ndsl.util.Checkpointer] = None, ): orchestrate( obj=self, @@ -709,7 +709,6 @@ def __call__( ) if last_step: - # on the last step, we need the regular temperature to send # to the physics, but if we're staying in dynamics we need # to keep it as the virtual potential temperature diff --git a/fv3core/pace/fv3core/stencils/riem_solver3.py b/fv3core/pace/fv3core/stencils/riem_solver3.py index 4275747a..1c3b692d 100644 --- a/fv3core/pace/fv3core/stencils/riem_solver3.py +++ b/fv3core/pace/fv3core/stencils/riem_solver3.py @@ -12,14 +12,14 @@ log, ) -import pace.util -import pace.util.constants as constants -from pace.dsl.dace import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ +import ndsl.util +import ndsl.util.constants as constants +from ndsl.dsl.dace import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.util import X_DIM, Y_DIM, Z_DIM, Z_INTERFACE_DIM from pace.fv3core._config import RiemannConfig from pace.fv3core.stencils.sim1_solver import Sim1Solver -from pace.util import X_DIM, Y_DIM, Z_DIM, Z_INTERFACE_DIM @typing.no_type_check @@ -158,7 +158,7 @@ class NonhydrostaticVerticalSolver: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, config: RiemannConfig, ): grid_indexing = stencil_factory.grid_indexing diff --git a/fv3core/pace/fv3core/stencils/riem_solver_c.py b/fv3core/pace/fv3core/stencils/riem_solver_c.py index d3ab8611..0f77a06a 100644 --- a/fv3core/pace/fv3core/stencils/riem_solver_c.py +++ b/fv3core/pace/fv3core/stencils/riem_solver_c.py @@ -9,12 +9,12 @@ log, ) -import pace.util -import pace.util.constants as constants -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ +import ndsl.util +import ndsl.util.constants as constants +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.util import X_DIM, Y_DIM, Z_DIM, Z_INTERFACE_DIM from pace.fv3core.stencils.sim1_solver import Sim1Solver -from pace.util import X_DIM, Y_DIM, Z_DIM, Z_INTERFACE_DIM @typing.no_type_check @@ -138,7 +138,7 @@ class NonhydrostaticVerticalSolverCGrid: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, p_fac: Float, ): grid_indexing = stencil_factory.grid_indexing diff --git a/fv3core/pace/fv3core/stencils/saturation_adjustment.py b/fv3core/pace/fv3core/stencils/saturation_adjustment.py index 41f3f39a..d2c8501d 100644 --- a/fv3core/pace/fv3core/stencils/saturation_adjustment.py +++ b/fv3core/pace/fv3core/stencils/saturation_adjustment.py @@ -11,9 +11,9 @@ log, ) -import pace.util.constants as constants -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ +import ndsl.util.constants as constants +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ from pace.fv3core._config import SatAdjustConfig from pace.fv3core.stencils.basic_operations import dim from pace.fv3core.stencils.moist_cv import compute_pkz_func diff --git a/fv3core/pace/fv3core/stencils/sim1_solver.py b/fv3core/pace/fv3core/stencils/sim1_solver.py index 9fc322b9..960f5b7a 100644 --- a/fv3core/pace/fv3core/stencils/sim1_solver.py +++ b/fv3core/pace/fv3core/stencils/sim1_solver.py @@ -10,10 +10,10 @@ log, ) -import pace.util.constants as constants -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ -from pace.util import X_DIM, Y_DIM, Z_INTERFACE_DIM +import ndsl.util.constants as constants +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.util import X_DIM, Y_DIM, Z_INTERFACE_DIM @typing.no_type_check diff --git a/fv3core/pace/fv3core/stencils/temperature_adjust.py b/fv3core/pace/fv3core/stencils/temperature_adjust.py index 0226df38..d3dd4046 100644 --- a/fv3core/pace/fv3core/stencils/temperature_adjust.py +++ b/fv3core/pace/fv3core/stencils/temperature_adjust.py @@ -1,7 +1,7 @@ from gt4py.cartesian.gtscript import PARALLEL, computation, exp, interval, log -import pace.util.constants as constants -from pace.dsl.typing import Float, FloatField +import ndsl.util.constants as constants +from ndsl.dsl.typing import Float, FloatField from pace.fv3core.stencils.basic_operations import sign diff --git a/fv3core/pace/fv3core/stencils/tracer_2d_1l.py b/fv3core/pace/fv3core/stencils/tracer_2d_1l.py index 02bc2dd6..977d6b13 100644 --- a/fv3core/pace/fv3core/stencils/tracer_2d_1l.py +++ b/fv3core/pace/fv3core/stencils/tracer_2d_1l.py @@ -4,14 +4,13 @@ import gt4py.cartesian.gtscript as gtscript from gt4py.cartesian.gtscript import PARALLEL, computation, horizontal, interval, region -import pace.dsl.gt4py_utils as utils -import pace.util -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.dace.wrapped_halo_exchange import WrappedHaloUpdater -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ +import ndsl.util +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.dace.wrapped_halo_exchange import WrappedHaloUpdater +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM from pace.fv3core.stencils.fvtp2d import FiniteVolumeTransport -from pace.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM @gtscript.function @@ -178,11 +177,11 @@ class TracerAdvection: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, transport: FiniteVolumeTransport, grid_data, - comm: pace.util.Communicator, - tracers: Dict[str, pace.util.Quantity], + comm: ndsl.util.Communicator, + tracers: Dict[str, ndsl.util.Quantity], ): orchestrate( obj=self, @@ -268,8 +267,8 @@ def __init__( # Setup halo updater for tracers tracer_halo_spec = quantity_factory.get_quantity_halo_spec( - dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], - n_halo=utils.halo, + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], + n_halo=ndsl.util.N_HALO_DEFAULT, dtype=Float, ) self._tracers_halo_updater = WrappedHaloUpdater( @@ -280,7 +279,7 @@ def __init__( def __call__( self, - tracers: Dict[str, pace.util.Quantity], + tracers: Dict[str, ndsl.util.Quantity], dp1, x_mass_flux, y_mass_flux, diff --git a/fv3core/pace/fv3core/stencils/updatedzc.py b/fv3core/pace/fv3core/stencils/updatedzc.py index 74761ea9..dd262bbc 100644 --- a/fv3core/pace/fv3core/stencils/updatedzc.py +++ b/fv3core/pace/fv3core/stencils/updatedzc.py @@ -1,12 +1,12 @@ import gt4py.cartesian.gtscript as gtscript from gt4py.cartesian.gtscript import BACKWARD, FORWARD, PARALLEL, computation, interval -import pace.util -import pace.util.constants as constants -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ, FloatFieldK -from pace.stencils import corners -from pace.util import X_DIM, Y_DIM, Z_DIM +import ndsl.util +import ndsl.util.constants as constants +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ, FloatFieldK +from ndsl.stencils import corners +from ndsl.util import X_DIM, Y_DIM, Z_DIM DZ_MIN = constants.DZ_MIN @@ -121,9 +121,9 @@ class UpdateGeopotentialHeightOnCGrid: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, - area: pace.util.Quantity, - dp_ref: pace.util.Quantity, + quantity_factory: ndsl.util.QuantityFactory, + area: ndsl.util.Quantity, + dp_ref: ndsl.util.Quantity, grid_type, ): grid_indexing = stencil_factory.grid_indexing diff --git a/fv3core/pace/fv3core/stencils/updatedzd.py b/fv3core/pace/fv3core/stencils/updatedzd.py index 92dd1c20..47ef619f 100644 --- a/fv3core/pace/fv3core/stencils/updatedzd.py +++ b/fv3core/pace/fv3core/stencils/updatedzd.py @@ -3,14 +3,12 @@ import gt4py.cartesian.gtscript as gtscript from gt4py.cartesian.gtscript import BACKWARD, FORWARD, PARALLEL, computation, interval -import pace.util -import pace.util.constants as constants -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ, FloatFieldK -from pace.fv3core.stencils.delnflux import DelnFluxNoSG -from pace.fv3core.stencils.fvtp2d import FiniteVolumeTransport -from pace.util import ( +import ndsl.util +import ndsl.util.constants as constants +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ, FloatFieldK +from ndsl.util import ( X_DIM, X_INTERFACE_DIM, Y_DIM, @@ -18,7 +16,9 @@ Z_DIM, Z_INTERFACE_DIM, ) -from pace.util.grid import DampingCoefficients, GridData +from ndsl.util.grid import DampingCoefficients, GridData +from pace.fv3core.stencils.delnflux import DelnFluxNoSG +from pace.fv3core.stencils.fvtp2d import FiniteVolumeTransport DZ_MIN = constants.DZ_MIN @@ -127,8 +127,8 @@ def apply_height_fluxes( def cubic_spline_interpolation_constants( - dp0: pace.util.Quantity, quantity_factory: pace.util.QuantityFactory -) -> Tuple[pace.util.Quantity, pace.util.Quantity, pace.util.Quantity]: + dp0: ndsl.util.Quantity, quantity_factory: ndsl.util.QuantityFactory +) -> Tuple[ndsl.util.Quantity, ndsl.util.Quantity, ndsl.util.Quantity]: """ Computes constants used in cubic spline interpolation from cell center to interface levels. @@ -216,7 +216,7 @@ class UpdateHeightOnDGrid: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, damping_coefficients: DampingCoefficients, grid_data: GridData, grid_type: int, @@ -265,7 +265,7 @@ def __init__( domain=grid_indexing.domain_compute(add=(0, 0, 1)), ) - def _allocate_temporary_storages(self, quantity_factory: pace.util.QuantityFactory): + def _allocate_temporary_storages(self, quantity_factory: ndsl.util.QuantityFactory): self._crx_interface = quantity_factory.zeros( [X_INTERFACE_DIM, Y_DIM, Z_INTERFACE_DIM], "", diff --git a/fv3core/pace/fv3core/stencils/xppm.py b/fv3core/pace/fv3core/stencils/xppm.py index afa9c2df..5d900346 100644 --- a/fv3core/pace/fv3core/stencils/xppm.py +++ b/fv3core/pace/fv3core/stencils/xppm.py @@ -9,8 +9,8 @@ region, ) -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import FloatField, FloatFieldIJ, Index3D +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import FloatField, FloatFieldIJ, Index3D from pace.fv3core.stencils import ppm from pace.fv3core.stencils.basic_operations import sign diff --git a/fv3core/pace/fv3core/stencils/xtp_u.py b/fv3core/pace/fv3core/stencils/xtp_u.py index 1b511e00..3e6f8095 100644 --- a/fv3core/pace/fv3core/stencils/xtp_u.py +++ b/fv3core/pace/fv3core/stencils/xtp_u.py @@ -1,7 +1,7 @@ from gt4py.cartesian import gtscript from gt4py.cartesian.gtscript import __INLINED, compile_assert, horizontal, region -from pace.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ from pace.fv3core.stencils import ppm, xppm diff --git a/fv3core/pace/fv3core/stencils/yppm.py b/fv3core/pace/fv3core/stencils/yppm.py index d61b0ca3..79b1499a 100644 --- a/fv3core/pace/fv3core/stencils/yppm.py +++ b/fv3core/pace/fv3core/stencils/yppm.py @@ -9,9 +9,9 @@ region, ) -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import FloatField, FloatFieldIJ, Index3D +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import FloatField, FloatFieldIJ, Index3D from pace.fv3core.stencils import ppm from pace.fv3core.stencils.basic_operations import sign diff --git a/fv3core/pace/fv3core/stencils/ytp_v.py b/fv3core/pace/fv3core/stencils/ytp_v.py index 8b4cb7d3..24e02dd3 100644 --- a/fv3core/pace/fv3core/stencils/ytp_v.py +++ b/fv3core/pace/fv3core/stencils/ytp_v.py @@ -1,7 +1,7 @@ from gt4py.cartesian import gtscript from gt4py.cartesian.gtscript import __INLINED, compile_assert, horizontal, region -from pace.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ from pace.fv3core.stencils import ppm, yppm diff --git a/fv3core/pace/fv3core/testing/map_single.py b/fv3core/pace/fv3core/testing/map_single.py index 30db7458..bb9bdfe3 100644 --- a/fv3core/pace/fv3core/testing/map_single.py +++ b/fv3core/pace/fv3core/testing/map_single.py @@ -1,9 +1,9 @@ from typing import Dict, Tuple -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util +from ndsl.util import X_INTERFACE_DIM, Y_INTERFACE_DIM, Z_DIM from pace.fv3core.stencils.map_single import MapSingle -from pace.util import X_INTERFACE_DIM, Y_INTERFACE_DIM, Z_DIM class MapSingleFactory: @@ -12,8 +12,8 @@ class MapSingleFactory: def __init__( self, - stencil_factory: pace.dsl.StencilFactory, - quantity_factory: pace.util.QuantityFactory, + stencil_factory: ndsl.dsl.StencilFactory, + quantity_factory: ndsl.util.QuantityFactory, ): self.stencil_factory = stencil_factory self.quantity_factory = quantity_factory diff --git a/fv3core/pace/fv3core/testing/translate_dyncore.py b/fv3core/pace/fv3core/testing/translate_dyncore.py index 6c7da4b7..dbdabd19 100644 --- a/fv3core/pace/fv3core/testing/translate_dyncore.py +++ b/fv3core/pace/fv3core/testing/translate_dyncore.py @@ -1,47 +1,47 @@ -import pace.dsl -import pace.dsl.gt4py_utils as utils +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util import pace.fv3core.stencils.dyn_core as dyn_core -import pace.util +from ndsl.stencils.testing import ParallelTranslate2PyState from pace.fv3core import DycoreState, DynamicalCoreConfig -from pace.stencils.testing import ParallelTranslate2PyState class TranslateDynCore(ParallelTranslate2PyState): inputs = { "q_con": { - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "default", }, "cappa": { - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "default", }, "delp": { - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "default", }, "pt": { - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "K", }, "u": { - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM, ndsl.util.Z_DIM], "units": "m/s", }, "v": { - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", }, "uc": { - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", }, "vc": { - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM, ndsl.util.Z_DIM], "units": "m/s", }, "w": { - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", }, } @@ -49,8 +49,8 @@ class TranslateDynCore(ParallelTranslate2PyState): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self._base.in_vars["data_vars"] = { @@ -140,20 +140,20 @@ def compute_parallel(self, inputs, communicator): grid_data.ptop = inputs["ptop"] self._base.make_storage_data_input_vars(inputs) state = DycoreState.init_zeros(quantity_factory=self.grid.quantity_factory) - wsd: pace.util.Quantity = self.grid.quantity_factory.zeros( - dims=[pace.util.X_DIM, pace.util.Y_DIM], + wsd: ndsl.util.Quantity = self.grid.quantity_factory.zeros( + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="unknown", ) for name, value in inputs.items(): - if hasattr(state, name) and isinstance(state[name], pace.util.Quantity): + if hasattr(state, name) and isinstance(state[name], ndsl.util.Quantity): # the ndarray can have buffer points at the end, so value.shape # is often not equal to state[name].shape selection = tuple(slice(0, end) for end in value.shape) state[name].data[selection] = value else: setattr(state, name, value) - phis: pace.util.Quantity = self.grid.quantity_factory.zeros( - dims=[pace.util.X_DIM, pace.util.Y_DIM], + phis: ndsl.util.Quantity = self.grid.quantity_factory.zeros( + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", ) phis.data[:] = phis.np.asarray(inputs["phis"]) @@ -178,7 +178,7 @@ def compute_parallel(self, inputs, communicator): # on variables attached to `state` storages_only = {} for name, value in vars(state).items(): - if isinstance(value, pace.util.Quantity): + if isinstance(value, ndsl.util.Quantity): storages_only[name] = value.data else: storages_only[name] = value diff --git a/fv3core/pace/fv3core/testing/translate_fvdynamics.py b/fv3core/pace/fv3core/testing/translate_fvdynamics.py index cdd773f7..6b897707 100644 --- a/fv3core/pace/fv3core/testing/translate_fvdynamics.py +++ b/fv3core/pace/fv3core/testing/translate_fvdynamics.py @@ -4,23 +4,23 @@ import pytest -import pace.dsl -import pace.dsl.gt4py_utils as utils +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util import pace.fv3core.stencils.fv_dynamics as fv_dynamics -import pace.util +from ndsl.stencils.testing import ParallelTranslateBaseSlicing +from ndsl.stencils.testing.translate import TranslateFortranData2Py +from ndsl.util.grid import GridData from pace.fv3core._config import DynamicalCoreConfig from pace.fv3core.dycore_state import DycoreState -from pace.stencils.testing import ParallelTranslateBaseSlicing -from pace.stencils.testing.translate import TranslateFortranData2Py -from pace.util.grid import GridData class TranslateDycoreFortranData2Py(TranslateFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, stencil_factory) self.namelist = DynamicalCoreConfig.from_namelist(namelist) @@ -31,180 +31,180 @@ class TranslateFVDynamics(ParallelTranslateBaseSlicing): inputs: Dict[str, Any] = { "q_con": { "name": "total_condensate_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", }, "delp": { "name": "pressure_thickness_of_atmospheric_layer", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "Pa", }, "delz": { "name": "vertical_thickness_of_atmospheric_layer", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m", }, "ps": { "name": "surface_pressure", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "Pa", }, "pe": { "name": "interface_pressure", - "dims": [pace.util.X_DIM, pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "Pa", "n_halo": 1, }, "ak": { "name": "atmosphere_hybrid_a_coordinate", - "dims": [pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.Z_INTERFACE_DIM], "units": "Pa", }, "bk": { "name": "atmosphere_hybrid_b_coordinate", - "dims": [pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.Z_INTERFACE_DIM], "units": "", }, "pk": { "name": "interface_pressure_raised_to_power_of_kappa", "units": "unknown", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_INTERFACE_DIM], "n_halo": 0, }, "pkz": { "name": "layer_mean_pressure_raised_to_power_of_kappa", "units": "unknown", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "n_halo": 0, }, "peln": { "name": "logarithm_of_interface_pressure", "units": "ln(Pa)", - "dims": [pace.util.X_DIM, pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM], "n_halo": 0, }, "mfxd": { "name": "accumulated_x_mass_flux", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "unknown", "n_halo": 0, }, "mfyd": { "name": "accumulated_y_mass_flux", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM, ndsl.util.Z_DIM], "units": "unknown", "n_halo": 0, }, "cxd": { "name": "accumulated_x_courant_number", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "", "n_halo": (0, 3), }, "cyd": { "name": "accumulated_y_courant_number", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM, ndsl.util.Z_DIM], "units": "", "n_halo": (3, 0), }, "diss_estd": { "name": "dissipation_estimate_from_heat_source", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "unknown", }, "pt": { "name": "air_temperature", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "degK", }, "u": { "name": "x_wind", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM, ndsl.util.Z_DIM], "units": "m/s", }, "v": { "name": "y_wind", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", }, "ua": { "name": "eastward_wind", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", }, "va": { "name": "northward_wind", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", }, "uc": { "name": "x_wind_on_c_grid", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", }, "vc": { "name": "y_wind_on_c_grid", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM, ndsl.util.Z_DIM], "units": "m/s", }, "w": { "name": "vertical_wind", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", }, "phis": { "name": "surface_geopotential", "units": "m^2 s^-2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], }, "qvapor": { "name": "specific_humidity", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", }, "qliquid": { "name": "cloud_water_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", }, "qice": { "name": "cloud_ice_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", }, "qrain": { "name": "rain_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", }, "qsnow": { "name": "snow_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", }, "qgraupel": { "name": "graupel_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", }, "qo3mr": { "name": "ozone_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", }, "qsgs_tke": { "name": "turbulent_kinetic_energy", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m**2/s**2", }, "qcld": { "name": "cloud_fraction", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "", }, "omga": { "name": "vertical_pressure_velocity", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "Pa/s", }, "bdt": {"dims": []}, @@ -219,8 +219,8 @@ class TranslateFVDynamics(ParallelTranslateBaseSlicing): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, *args, **kwargs, ): @@ -335,7 +335,7 @@ def compute_parallel(self, inputs, communicator): state=state, timestep=timedelta(seconds=inputs["bdt"]), ) - self.dycore.step_dynamics(state, pace.util.NullTimer()) + self.dycore.step_dynamics(state, ndsl.util.NullTimer()) outputs = self.outputs_from_state(state) return outputs @@ -345,7 +345,7 @@ def outputs_from_state(self, state: dict): outputs = {} storages = {} for name, properties in self.outputs.items(): - if isinstance(state[name], pace.util.Quantity): + if isinstance(state[name], ndsl.util.Quantity): storages[name] = state[name].data elif len(self.outputs[name]["dims"]) > 0: storages[name] = state[name] # assume it's a storage diff --git a/fv3core/pace/fv3core/testing/validation.py b/fv3core/pace/fv3core/testing/validation.py index 75707441..06af633c 100644 --- a/fv3core/pace/fv3core/testing/validation.py +++ b/fv3core/pace/fv3core/testing/validation.py @@ -5,8 +5,8 @@ import pace.fv3core.stencils.divergence_damping import pace.fv3core.stencils.updatedzd -from pace.util.constants import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM -from pace.util.quantity import Quantity +from ndsl.util.constants import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM +from ndsl.util.quantity import Quantity def get_selective_class( @@ -30,7 +30,6 @@ class SelectivelyValidated: """ def __init__(self, *args, **kwargs): - self.wrapped = cls(*args, **kwargs) self._validation_slice = {} diff --git a/fv3core/pace/fv3core/utils/functional_validation.py b/fv3core/pace/fv3core/utils/functional_validation.py index 871dcac9..728e937e 100644 --- a/fv3core/pace/fv3core/utils/functional_validation.py +++ b/fv3core/pace/fv3core/utils/functional_validation.py @@ -3,7 +3,7 @@ import numpy as np -from pace.dsl.stencil import GridIndexing +from ndsl.dsl.stencil import GridIndexing def get_subset_func( diff --git a/fv3core/pace/fv3core/wrappers/geos_wrapper.py b/fv3core/pace/fv3core/wrappers/geos_wrapper.py index 9f8347f3..8f6a5b66 100644 --- a/fv3core/pace/fv3core/wrappers/geos_wrapper.py +++ b/fv3core/pace/fv3core/wrappers/geos_wrapper.py @@ -9,16 +9,16 @@ from gt4py.cartesian.config import build_settings as gt_build_settings from mpi4py import MPI -import pace.util +import ndsl.util +from ndsl.dsl.dace import orchestrate +from ndsl.dsl.dace.build import set_distributed_caches +from ndsl.dsl.dace.dace_config import DaceConfig, DaCeOrchestration +from ndsl.dsl.gt4py_utils import is_gpu_backend +from ndsl.dsl.typing import floating_point_precision +from ndsl.util._optional_imports import cupy as cp +from ndsl.util.logging import pace_log from pace import fv3core from pace.driver.performance.collector import PerformanceCollector -from pace.dsl.dace import orchestrate -from pace.dsl.dace.build import set_distributed_caches -from pace.dsl.dace.dace_config import DaceConfig, DaCeOrchestration -from pace.dsl.gt4py_utils import is_gpu_backend -from pace.dsl.typing import floating_point_precision -from pace.util._optional_imports import cupy as cp -from pace.util.logging import pace_log class StencilBackendCompilerOverride: @@ -87,14 +87,14 @@ def __init__( self, namelist: f90nml.Namelist, bdt: int, - comm: pace.util.Comm, + comm: ndsl.util.Comm, backend: str, fortran_mem_space: MemorySpace = MemorySpace.HOST, ): # Look for an override to run on a single node gtfv3_single_rank_override = int(os.getenv("GTFV3_SINGLE_RANK_OVERRIDE", -1)) if gtfv3_single_rank_override >= 0: - comm = pace.util.NullComm(gtfv3_single_rank_override, 6, 42) + comm = ndsl.util.NullComm(gtfv3_single_rank_override, 6, 42) # Make a custom performance collector for the GEOS wrapper self.perf_collector = PerformanceCollector("GEOS wrapper", comm) @@ -106,32 +106,32 @@ def __init__( assert self.dycore_config.dt_atmos != 0 self.layout = self.dycore_config.layout - partitioner = pace.util.CubedSpherePartitioner( - pace.util.TilePartitioner(self.layout) + partitioner = ndsl.util.CubedSpherePartitioner( + ndsl.util.TilePartitioner(self.layout) ) - self.communicator = pace.util.CubedSphereCommunicator( + self.communicator = ndsl.util.CubedSphereCommunicator( comm, partitioner, timer=self.perf_collector.timestep_timer, ) - sizer = pace.util.SubtileGridSizer.from_namelist( + sizer = ndsl.util.SubtileGridSizer.from_namelist( self.namelist, partitioner.tile, self.communicator.tile.rank ) - quantity_factory = pace.util.QuantityFactory.from_backend( + quantity_factory = ndsl.util.QuantityFactory.from_backend( sizer=sizer, backend=backend ) # set up the metric terms and grid data - metric_terms = pace.util.grid.MetricTerms( + metric_terms = ndsl.util.grid.MetricTerms( quantity_factory=quantity_factory, communicator=self.communicator, eta_file=namelist["grid_config"]["config"]["eta_file"], ) - grid_data = pace.util.grid.GridData.new_from_metric_terms(metric_terms) + grid_data = ndsl.util.grid.GridData.new_from_metric_terms(metric_terms) - stencil_config = pace.dsl.stencil.StencilConfig( - compilation_config=pace.dsl.stencil.CompilationConfig( + stencil_config = ndsl.dsl.stencil.StencilConfig( + compilation_config=ndsl.dsl.stencil.CompilationConfig( backend=backend, rebuild=False, validate_args=False ), ) @@ -154,10 +154,10 @@ def __init__( method_to_orchestrate="_critical_path", ) - self._grid_indexing = pace.dsl.stencil.GridIndexing.from_sizer_and_communicator( + self._grid_indexing = ndsl.dsl.stencil.GridIndexing.from_sizer_and_communicator( sizer=sizer, comm=self.communicator ) - stencil_factory = pace.dsl.StencilFactory( + stencil_factory = ndsl.dsl.StencilFactory( config=stencil_config, grid_indexing=self._grid_indexing ) @@ -166,7 +166,7 @@ def __init__( ) self.dycore_state.bdt = self.dycore_config.dt_atmos - damping_coefficients = pace.util.grid.DampingCoefficients.new_from_metric_terms( + damping_coefficients = ndsl.util.grid.DampingCoefficients.new_from_metric_terms( metric_terms ) @@ -332,62 +332,62 @@ def _put_fortran_data_in_dycore( state = self.dycore_state # Assign compute domain: - pace.util.utils.safe_assign_array(state.u.view[:], u[isc:iec, jsc : jec + 1, :]) - pace.util.utils.safe_assign_array(state.v.view[:], v[isc : iec + 1, jsc:jec, :]) - pace.util.utils.safe_assign_array(state.w.view[:], w[isc:iec, jsc:jec, :]) - pace.util.utils.safe_assign_array(state.ua.view[:], ua[isc:iec, jsc:jec, :]) - pace.util.utils.safe_assign_array(state.va.view[:], va[isc:iec, jsc:jec, :]) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array(state.u.view[:], u[isc:iec, jsc : jec + 1, :]) + ndsl.util.utils.safe_assign_array(state.v.view[:], v[isc : iec + 1, jsc:jec, :]) + ndsl.util.utils.safe_assign_array(state.w.view[:], w[isc:iec, jsc:jec, :]) + ndsl.util.utils.safe_assign_array(state.ua.view[:], ua[isc:iec, jsc:jec, :]) + ndsl.util.utils.safe_assign_array(state.va.view[:], va[isc:iec, jsc:jec, :]) + ndsl.util.utils.safe_assign_array( state.uc.view[:], uc[isc : iec + 1, jsc:jec, :] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( state.vc.view[:], vc[isc:iec, jsc : jec + 1, :] ) - pace.util.utils.safe_assign_array(state.delz.view[:], delz[isc:iec, jsc:jec, :]) - pace.util.utils.safe_assign_array(state.pt.view[:], pt[isc:iec, jsc:jec, :]) - pace.util.utils.safe_assign_array(state.delp.view[:], delp[isc:iec, jsc:jec, :]) + ndsl.util.utils.safe_assign_array(state.delz.view[:], delz[isc:iec, jsc:jec, :]) + ndsl.util.utils.safe_assign_array(state.pt.view[:], pt[isc:iec, jsc:jec, :]) + ndsl.util.utils.safe_assign_array(state.delp.view[:], delp[isc:iec, jsc:jec, :]) - pace.util.utils.safe_assign_array(state.mfxd.view[:], mfxd) - pace.util.utils.safe_assign_array(state.mfyd.view[:], mfyd) - pace.util.utils.safe_assign_array(state.cxd.view[:], cxd[:, jsc:jec, :]) - pace.util.utils.safe_assign_array(state.cyd.view[:], cyd[isc:iec, :, :]) + ndsl.util.utils.safe_assign_array(state.mfxd.view[:], mfxd) + ndsl.util.utils.safe_assign_array(state.mfyd.view[:], mfyd) + ndsl.util.utils.safe_assign_array(state.cxd.view[:], cxd[:, jsc:jec, :]) + ndsl.util.utils.safe_assign_array(state.cyd.view[:], cyd[isc:iec, :, :]) - pace.util.utils.safe_assign_array(state.ps.view[:], ps[isc:iec, jsc:jec]) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array(state.ps.view[:], ps[isc:iec, jsc:jec]) + ndsl.util.utils.safe_assign_array( state.pe.data[isc - 1 : iec + 1, jsc - 1 : jec + 1, :], pe ) - pace.util.utils.safe_assign_array(state.pk.view[:], pk) - pace.util.utils.safe_assign_array(state.peln.view[:], peln) - pace.util.utils.safe_assign_array(state.pkz.view[:], pkz) - pace.util.utils.safe_assign_array(state.phis.view[:], phis[isc:iec, jsc:jec]) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array(state.pk.view[:], pk) + ndsl.util.utils.safe_assign_array(state.peln.view[:], peln) + ndsl.util.utils.safe_assign_array(state.pkz.view[:], pkz) + ndsl.util.utils.safe_assign_array(state.phis.view[:], phis[isc:iec, jsc:jec]) + ndsl.util.utils.safe_assign_array( state.q_con.view[:], q_con[isc:iec, jsc:jec, :] ) - pace.util.utils.safe_assign_array(state.omga.view[:], omga[isc:iec, jsc:jec, :]) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array(state.omga.view[:], omga[isc:iec, jsc:jec, :]) + ndsl.util.utils.safe_assign_array( state.diss_estd.view[:], diss_estd[isc:iec, jsc:jec, :] ) # tracer quantities should be a 4d array in order: # vapor, liquid, ice, rain, snow, graupel, cloud - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( state.qvapor.view[:], q[isc:iec, jsc:jec, :, 0] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( state.qliquid.view[:], q[isc:iec, jsc:jec, :, 1] ) - pace.util.utils.safe_assign_array(state.qice.view[:], q[isc:iec, jsc:jec, :, 2]) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array(state.qice.view[:], q[isc:iec, jsc:jec, :, 2]) + ndsl.util.utils.safe_assign_array( state.qrain.view[:], q[isc:iec, jsc:jec, :, 3] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( state.qsnow.view[:], q[isc:iec, jsc:jec, :, 4] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( state.qgraupel.view[:], q[isc:iec, jsc:jec, :, 5] ) - pace.util.utils.safe_assign_array(state.qcld.view[:], q[isc:iec, jsc:jec, :, 6]) + ndsl.util.utils.safe_assign_array(state.qcld.view[:], q[isc:iec, jsc:jec, :, 6]) return state @@ -399,102 +399,102 @@ def _prep_outputs_for_geos(self) -> Dict[str, np.ndarray]: jec = self._grid_indexing.jec + 1 if self._fortran_mem_space != self._pace_mem_space: - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["u"], self.dycore_state.u.data[:-1, :, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["v"], self.dycore_state.v.data[:, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["w"], self.dycore_state.w.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["ua"], self.dycore_state.ua.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["va"], self.dycore_state.va.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["uc"], self.dycore_state.uc.data[:, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["vc"], self.dycore_state.vc.data[:-1, :, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["delz"], self.dycore_state.delz.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["pt"], self.dycore_state.pt.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["delp"], self.dycore_state.delp.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["mfxd"], self.dycore_state.mfxd.data[isc : iec + 1, jsc:jec, :-1], ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["mfyd"], self.dycore_state.mfyd.data[isc:iec, jsc : jec + 1, :-1], ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["cxd"], self.dycore_state.cxd.data[isc : iec + 1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["cyd"], self.dycore_state.cyd.data[:-1, jsc : jec + 1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["ps"], self.dycore_state.ps.data[:-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["pe"], self.dycore_state.pe.data[isc - 1 : iec + 1, jsc - 1 : jec + 1, :], ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["pk"], self.dycore_state.pk.data[isc:iec, jsc:jec, :] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["peln"], self.dycore_state.peln.data[isc:iec, jsc:jec, :] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["pkz"], self.dycore_state.pkz.data[isc:iec, jsc:jec, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["phis"], self.dycore_state.phis.data[:-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["q_con"], self.dycore_state.q_con.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["omga"], self.dycore_state.omga.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["diss_estd"], self.dycore_state.diss_estd.data[:-1, :-1, :-1], ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["qvapor"], self.dycore_state.qvapor.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["qliquid"], self.dycore_state.qliquid.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["qice"], self.dycore_state.qice.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["qrain"], self.dycore_state.qrain.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["qsnow"], self.dycore_state.qsnow.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["qgraupel"], self.dycore_state.qgraupel.data[:-1, :-1, :-1] ) - pace.util.utils.safe_assign_array( + ndsl.util.utils.safe_assign_array( output_dict["qcld"], self.dycore_state.qcld.data[:-1, :-1, :-1] ) else: diff --git a/fv3core/setup.py b/fv3core/setup.py index aa709386..d6de10be 100644 --- a/fv3core/setup.py +++ b/fv3core/setup.py @@ -13,9 +13,7 @@ "f90nml>=1.1.0", "gt4py", "numpy", - "pace-util>=0.4.3", - "pace-stencils", - "pace-dsl", + "ndsl", "xarray", ] diff --git a/fv3core/tests/mpi/test_doubly_periodic.py b/fv3core/tests/mpi/test_doubly_periodic.py index 5a4e6aa6..6db3f1c8 100644 --- a/fv3core/tests/mpi/test_doubly_periodic.py +++ b/fv3core/tests/mpi/test_doubly_periodic.py @@ -1,13 +1,13 @@ from datetime import timedelta from typing import Any, List, Tuple, cast -import pace.dsl.stencil +import ndsl.dsl.stencil +import ndsl.stencils.testing +import ndsl.util import pace.fv3core import pace.fv3core._config import pace.fv3core.initialization.baroclinic as baroclinic_init -import pace.stencils.testing -import pace.util -from pace.util.grid import DampingCoefficients, GridData, MetricTerms +from ndsl.util.grid import DampingCoefficients, GridData, MetricTerms def setup_dycore() -> Tuple[pace.fv3core.DynamicalCore, List[Any]]: @@ -57,26 +57,26 @@ def setup_dycore() -> Tuple[pace.fv3core.DynamicalCore, List[Any]]: z_tracer=True, do_qa=True, ) - mpi_comm = pace.util.MPIComm() - partitioner = pace.util.TilePartitioner(config.layout) + mpi_comm = ndsl.util.MPIComm() + partitioner = ndsl.util.TilePartitioner(config.layout) # TODO: cleanup typing of tile vs cubed sphere communicators, # currently both have a .tile attribute that reference a TileCommunicator # instead both should have the methods specific to a TileCommunicator # (to be put on the Communicator abstract base class) and # the CubedSphere implementation should defer to the tile. communicator = cast( - pace.util.CubedSphereCommunicator, - pace.util.TileCommunicator(mpi_comm, partitioner), + ndsl.util.CubedSphereCommunicator, + ndsl.util.TileCommunicator(mpi_comm, partitioner), ) - stencil_config = pace.dsl.stencil.StencilConfig( - compilation_config=pace.dsl.stencil.CompilationConfig( + stencil_config = ndsl.dsl.stencil.StencilConfig( + compilation_config=ndsl.dsl.stencil.CompilationConfig( communicator=communicator, backend=backend, rebuild=False, validate_args=True, ) ) - sizer = pace.util.SubtileGridSizer.from_tile_params( + sizer = ndsl.util.SubtileGridSizer.from_tile_params( nx_tile=config.npx - 1, ny_tile=config.npy - 1, nz=config.npz, @@ -86,10 +86,10 @@ def setup_dycore() -> Tuple[pace.fv3core.DynamicalCore, List[Any]]: tile_partitioner=partitioner, tile_rank=communicator.rank, ) - grid_indexing = pace.dsl.stencil.GridIndexing.from_sizer_and_communicator( + grid_indexing = ndsl.dsl.stencil.GridIndexing.from_sizer_and_communicator( sizer=sizer, comm=communicator ) - quantity_factory = pace.util.QuantityFactory.from_backend( + quantity_factory = ndsl.util.QuantityFactory.from_backend( sizer=sizer, backend=backend ) metric_terms = MetricTerms( @@ -108,7 +108,7 @@ def setup_dycore() -> Tuple[pace.fv3core.DynamicalCore, List[Any]]: moist_phys=config.moist_phys, comm=communicator, ) - stencil_factory = pace.dsl.stencil.StencilFactory( + stencil_factory = ndsl.dsl.stencil.StencilFactory( config=stencil_config, grid_indexing=grid_indexing, ) diff --git a/fv3core/tests/savepoint/conftest.py b/fv3core/tests/savepoint/conftest.py index 02081ab2..ae6d75ad 100644 --- a/fv3core/tests/savepoint/conftest.py +++ b/fv3core/tests/savepoint/conftest.py @@ -10,10 +10,10 @@ # this must happen before any classes from fv3core are instantiated pace.fv3core.testing.enable_selective_validation() -import pace.stencils.testing.conftest -from pace.stencils.testing.conftest import * # noqa: F403,F401 +import ndsl.stencils.testing.conftest +from ndsl.stencils.testing.conftest import * # noqa: F403,F401 from . import translate -pace.stencils.testing.conftest.translate = translate # type: ignore +ndsl.stencils.testing.conftest.translate = translate # type: ignore diff --git a/fv3core/tests/savepoint/test_translate.py b/fv3core/tests/savepoint/test_translate.py index 5550ff1f..8dadf15a 100644 --- a/fv3core/tests/savepoint/test_translate.py +++ b/fv3core/tests/savepoint/test_translate.py @@ -1 +1 @@ -from pace.stencils.testing.test_translate import * # noqa: F403,F401 +from ndsl.stencils.testing.test_translate import * # noqa: F403,F401 diff --git a/fv3core/tests/savepoint/translate/translate_a2b_ord4.py b/fv3core/tests/savepoint/translate/translate_a2b_ord4.py index 3cb124e5..663c20c6 100644 --- a/fv3core/tests/savepoint/translate/translate_a2b_ord4.py +++ b/fv3core/tests/savepoint/translate/translate_a2b_ord4.py @@ -1,9 +1,9 @@ from typing import Any, Dict -import pace.dsl -import pace.util -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory +import ndsl.dsl +import ndsl.util +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory from pace.fv3core.stencils.divergence_damping import DivergenceDamping from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -49,8 +49,8 @@ class TranslateA2B_Ord4(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) assert namelist.grid_type < 3 @@ -63,7 +63,7 @@ def __init__( def compute_from_storage(self, inputs): nord_col = self.grid.quantity_factory.zeros( - dims=[pace.util.Z_DIM], units="unknown" + dims=[ndsl.util.Z_DIM], units="unknown" ) nord_col.data[:] = nord_col.np.asarray(inputs.pop("nord_col")) divdamp = DivergenceDamping( diff --git a/fv3core/tests/savepoint/translate/translate_c_sw.py b/fv3core/tests/savepoint/translate/translate_c_sw.py index bcf4d0f4..e1aadcfc 100644 --- a/fv3core/tests/savepoint/translate/translate_c_sw.py +++ b/fv3core/tests/savepoint/translate/translate_c_sw.py @@ -1,14 +1,14 @@ -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util from pace.fv3core.stencils.c_sw import CGridShallowWaterDynamics from pace.fv3core.testing import TranslateDycoreFortranData2Py def get_c_sw_instance( grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, - quantity_factory: pace.util.QuantityFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, + quantity_factory: ndsl.util.QuantityFactory, ): return CGridShallowWaterDynamics( stencil_factory, @@ -71,8 +71,8 @@ class TranslateC_SW(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) cgrid_shallow_water_lagrangian_dynamics = get_c_sw_instance( @@ -117,8 +117,8 @@ class TranslateDivergenceCorner(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.max_error = 9e-10 @@ -175,8 +175,8 @@ class TranslateCirculation_Cgrid(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.max_error = 5e-9 @@ -217,8 +217,8 @@ class TranslateVorticityTransport_Cgrid(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) cgrid_sw_lagrangian_dynamics = get_c_sw_instance( diff --git a/fv3core/tests/savepoint/translate/translate_corners.py b/fv3core/tests/savepoint/translate/translate_corners.py index e5045ef5..36190eaf 100644 --- a/fv3core/tests/savepoint/translate/translate_corners.py +++ b/fv3core/tests/savepoint/translate/translate_corners.py @@ -1,18 +1,18 @@ from typing import Any, Dict -import pace.dsl -import pace.dsl.gt4py_utils as utils -import pace.util +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +from ndsl.stencils import corners from pace.fv3core.testing import TranslateDycoreFortranData2Py -from pace.stencils import corners class TranslateFill4Corners(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = {"q4c": {}} @@ -47,8 +47,8 @@ class TranslateFillCorners(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = {"divg_d": {}, "nord_col": {}} @@ -94,8 +94,8 @@ class TranslateCopyCorners(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = {"q": {}} @@ -139,8 +139,8 @@ class TranslateFillCornersVector(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = {"vc": {}, "uc": {}, "nord_col": {}} diff --git a/fv3core/tests/savepoint/translate/translate_cubedtolatlon.py b/fv3core/tests/savepoint/translate/translate_cubedtolatlon.py index 526a61e3..e0488103 100644 --- a/fv3core/tests/savepoint/translate/translate_cubedtolatlon.py +++ b/fv3core/tests/savepoint/translate/translate_cubedtolatlon.py @@ -1,17 +1,17 @@ -import pace.dsl -import pace.util -from pace.stencils.c2l_ord import CubedToLatLon -from pace.stencils.testing import ParallelTranslate2Py +import ndsl.dsl +import ndsl.util +from ndsl.stencils.c2l_ord import CubedToLatLon +from ndsl.stencils.testing import ParallelTranslate2Py class TranslateCubedToLatLon(ParallelTranslate2Py): inputs = { "u": { - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM, ndsl.util.Z_DIM], "units": "m/s", }, "v": { - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", }, } @@ -19,8 +19,8 @@ class TranslateCubedToLatLon(ParallelTranslate2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self._base.in_vars["data_vars"] = {"u": {}, "v": {}, "ua": {}, "va": {}} @@ -62,7 +62,7 @@ def compute_parallel(self, inputs, communicator): def _quantity_wrap(storage, dims, grid_indexing): origin, extent = grid_indexing.get_origin_domain(dims) - return pace.util.Quantity( + return ndsl.util.Quantity( storage, dims=dims, units="unknown", diff --git a/fv3core/tests/savepoint/translate/translate_d2a2c_vect.py b/fv3core/tests/savepoint/translate/translate_d2a2c_vect.py index 89534085..10e681d4 100644 --- a/fv3core/tests/savepoint/translate/translate_d2a2c_vect.py +++ b/fv3core/tests/savepoint/translate/translate_d2a2c_vect.py @@ -1,5 +1,5 @@ -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util from pace.fv3core.stencils.d2a2c_vect import DGrid2AGrid2CGridVectors from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -8,8 +8,8 @@ class TranslateD2A2C_Vect(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) dord4 = True diff --git a/fv3core/tests/savepoint/translate/translate_d_sw.py b/fv3core/tests/savepoint/translate/translate_d_sw.py index be8a9d2b..e517c15a 100644 --- a/fv3core/tests/savepoint/translate/translate_d_sw.py +++ b/fv3core/tests/savepoint/translate/translate_d_sw.py @@ -1,10 +1,10 @@ from gt4py.cartesian.gtscript import PARALLEL, computation, interval -import pace.dsl +import ndsl.dsl +import ndsl.util import pace.fv3core.stencils.d_sw as d_sw -import pace.util +from ndsl.dsl.typing import FloatField, FloatFieldIJ from pace import fv3core -from pace.dsl.typing import FloatField, FloatFieldIJ from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -12,8 +12,8 @@ class TranslateD_SW(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.max_error = 3.2e-10 @@ -85,8 +85,8 @@ class TranslateUbKE(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { @@ -132,8 +132,8 @@ class TranslateVbKE(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { @@ -163,8 +163,8 @@ class TranslateFluxCapacitor(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { @@ -192,8 +192,8 @@ class TranslateHeatDiss(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { @@ -236,8 +236,8 @@ class TranslateWdivergence(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { diff --git a/fv3core/tests/savepoint/translate/translate_del2cubed.py b/fv3core/tests/savepoint/translate/translate_del2cubed.py index 2dfd0f55..626e51b7 100644 --- a/fv3core/tests/savepoint/translate/translate_del2cubed.py +++ b/fv3core/tests/savepoint/translate/translate_del2cubed.py @@ -1,7 +1,7 @@ from typing import Any, Dict -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util from pace.fv3core.stencils.del2cubed import HyperdiffusionDamping from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -10,8 +10,8 @@ class TranslateDel2Cubed(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = {"qdel": {}} diff --git a/fv3core/tests/savepoint/translate/translate_del6vtflux.py b/fv3core/tests/savepoint/translate/translate_del6vtflux.py index 5df4e4fc..ed2e1749 100644 --- a/fv3core/tests/savepoint/translate/translate_del6vtflux.py +++ b/fv3core/tests/savepoint/translate/translate_del6vtflux.py @@ -1,6 +1,6 @@ -import pace.dsl +import ndsl.dsl +import ndsl.util import pace.fv3core.stencils.delnflux as delnflux -import pace.util from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -8,8 +8,8 @@ class TranslateDel6VtFlux(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) fxstat = grid.x3d_domain_dict() @@ -37,7 +37,7 @@ def __init__( def compute(self, inputs): self.make_storage_data_input_vars(inputs) nord_col = self.grid.quantity_factory.zeros( - dims=[pace.util.Z_DIM], units="unknown" + dims=[ndsl.util.Z_DIM], units="unknown" ) nord_col.data[:] = nord_col.np.asarray(inputs.pop("nord_w")) self.compute_func = delnflux.DelnFluxNoSG( # type: ignore diff --git a/fv3core/tests/savepoint/translate/translate_delnflux.py b/fv3core/tests/savepoint/translate/translate_delnflux.py index a3112fa3..ceb5c00e 100644 --- a/fv3core/tests/savepoint/translate/translate_delnflux.py +++ b/fv3core/tests/savepoint/translate/translate_delnflux.py @@ -1,6 +1,6 @@ -import pace.dsl +import ndsl.dsl +import ndsl.util import pace.fv3core.stencils.delnflux as delnflux -import pace.util from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -8,8 +8,8 @@ class TranslateDelnFlux(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { @@ -30,11 +30,11 @@ def compute(self, inputs): inputs["mass"] = None self.make_storage_data_input_vars(inputs) nord_col = self.grid.quantity_factory.zeros( - dims=[pace.util.Z_DIM], units="unknown" + dims=[ndsl.util.Z_DIM], units="unknown" ) nord_col.data[:] = nord_col.np.asarray(inputs.pop("nord_column")) damp_c = self.grid.quantity_factory.zeros( - dims=[pace.util.Z_DIM], units="unknown" + dims=[ndsl.util.Z_DIM], units="unknown" ) damp_c.data[:] = damp_c.np.asarray(inputs.pop("damp_c")) self.compute_func = delnflux.DelnFlux( # type: ignore @@ -53,8 +53,8 @@ class TranslateDelnFlux_2(TranslateDelnFlux): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) del self.in_vars["data_vars"]["mass"] diff --git a/fv3core/tests/savepoint/translate/translate_divergencedamping.py b/fv3core/tests/savepoint/translate/translate_divergencedamping.py index 26e4c3d0..b5ff04cc 100644 --- a/fv3core/tests/savepoint/translate/translate_divergencedamping.py +++ b/fv3core/tests/savepoint/translate/translate_divergencedamping.py @@ -1,7 +1,7 @@ from typing import Optional -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util from pace.fv3core.stencils.divergence_damping import DivergenceDamping from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -10,8 +10,8 @@ class TranslateDivergenceDamping(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { @@ -41,11 +41,11 @@ def __init__( def compute_from_storage(self, inputs): nord_col = self.grid.quantity_factory.zeros( - dims=[pace.util.Z_DIM], units="unknown" + dims=[ndsl.util.Z_DIM], units="unknown" ) nord_col.data[:] = nord_col.np.asarray(inputs.pop("nord_col")) d2_bg = self.grid.quantity_factory.zeros( - dims=[pace.util.Z_DIM], units="unknown" + dims=[ndsl.util.Z_DIM], units="unknown" ) d2_bg.data[:] = d2_bg.np.asarray(inputs.pop("d2_bg")) self.divdamp = DivergenceDamping( diff --git a/fv3core/tests/savepoint/translate/translate_fillz.py b/fv3core/tests/savepoint/translate/translate_fillz.py index b90c7c5b..5013ac1f 100644 --- a/fv3core/tests/savepoint/translate/translate_fillz.py +++ b/fv3core/tests/savepoint/translate/translate_fillz.py @@ -1,20 +1,20 @@ import numpy as np -import pace.dsl -import pace.dsl.gt4py_utils as utils +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util import pace.fv3core.stencils.fillz as fillz -import pace.util +from ndsl.stencils.testing import pad_field_in_j +from ndsl.util.utils import safe_assign_array from pace.fv3core.testing import TranslateDycoreFortranData2Py -from pace.stencils.testing import pad_field_in_j -from pace.util.utils import safe_assign_array class TranslateFillz(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { diff --git a/fv3core/tests/savepoint/translate/translate_fvsubgridz.py b/fv3core/tests/savepoint/translate/translate_fvsubgridz.py index fdc0bc55..a56f48bf 100644 --- a/fv3core/tests/savepoint/translate/translate_fvsubgridz.py +++ b/fv3core/tests/savepoint/translate/translate_fvsubgridz.py @@ -1,11 +1,11 @@ from types import SimpleNamespace -import pace.dsl -import pace.dsl.gt4py_utils as utils +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +import ndsl.util as fv3util import pace.fv3core.stencils.fv_subgridz as fv_subgridz -import pace.util -import pace.util as fv3util -from pace.stencils.testing import ParallelTranslateBaseSlicing +from ndsl.stencils.testing import ParallelTranslateBaseSlicing # NOTE, does no halo updates, does not need to be a Parallel test, @@ -126,8 +126,8 @@ class TranslateFVSubgridZ(ParallelTranslateBaseSlicing): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, *args, **kwargs, ): diff --git a/fv3core/tests/savepoint/translate/translate_fvtp2d.py b/fv3core/tests/savepoint/translate/translate_fvtp2d.py index b807254d..ed1338f3 100644 --- a/fv3core/tests/savepoint/translate/translate_fvtp2d.py +++ b/fv3core/tests/savepoint/translate/translate_fvtp2d.py @@ -1,7 +1,7 @@ -import pace.dsl -import pace.dsl.gt4py_utils as utils -import pace.util -from pace.dsl.typing import Float +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +from ndsl.dsl.typing import Float from pace.fv3core.stencils.fvtp2d import FiniteVolumeTransport from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -10,8 +10,8 @@ class TranslateFvTp2d(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { @@ -52,11 +52,11 @@ def compute_from_storage(self, inputs): backend=self.stencil_factory.backend, ) nord_col = self.grid.quantity_factory.zeros( - dims=[pace.util.Z_DIM], units="unknown", dtype=Float + dims=[ndsl.util.Z_DIM], units="unknown", dtype=Float ) nord_col.data[:] = nord_col.np.asarray(inputs.pop("nord")) damp_c = self.grid.quantity_factory.zeros( - dims=[pace.util.Z_DIM], units="unknown", dtype=Float + dims=[ndsl.util.Z_DIM], units="unknown", dtype=Float ) damp_c.data[:] = damp_c.np.asarray(inputs.pop("damp_c")) for optional_arg in ["mass"]: @@ -80,8 +80,8 @@ class TranslateFvTp2d_2(TranslateFvTp2d): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) del self.in_vars["data_vars"]["mass"] diff --git a/fv3core/tests/savepoint/translate/translate_fxadv.py b/fv3core/tests/savepoint/translate/translate_fxadv.py index 3dec8293..35826e06 100644 --- a/fv3core/tests/savepoint/translate/translate_fxadv.py +++ b/fv3core/tests/savepoint/translate/translate_fxadv.py @@ -1,7 +1,7 @@ import numpy as np -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util from pace.fv3core.stencils.fxadv import FiniteVolumeFluxPrep from pace.fv3core.testing import TranslateDycoreFortranData2Py from pace.fv3core.utils.functional_validation import get_subset_func @@ -11,8 +11,8 @@ class TranslateFxAdv(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) utinfo = grid.x3d_domain_dict() @@ -51,7 +51,7 @@ def __init__( self._subset = get_subset_func( self.grid.grid_indexing, - dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], n_halo=((2, 2), (2, 2)), ) diff --git a/fv3core/tests/savepoint/translate/translate_grid.py b/fv3core/tests/savepoint/translate/translate_grid.py index b625b47b..f3423529 100644 --- a/fv3core/tests/savepoint/translate/translate_grid.py +++ b/fv3core/tests/savepoint/translate/translate_grid.py @@ -3,28 +3,27 @@ import numpy as np import pytest -import pace.dsl -import pace.dsl.gt4py_utils as utils -import pace.util -from pace.stencils.testing.parallel_translate import ParallelTranslateGrid -from pace.util.grid import MetricTerms, set_hybrid_pressure_coefficients -from pace.util.grid.global_setup import global_mirror_grid, gnomonic_grid +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +from ndsl.stencils.testing.parallel_translate import ParallelTranslateGrid +from ndsl.util.grid import MetricTerms, set_hybrid_pressure_coefficients +from ndsl.util.grid.global_setup import global_mirror_grid, gnomonic_grid class TranslateGnomonicGrids(ParallelTranslateGrid): - max_error = 2e-14 inputs = { "lon": { "name": "longitude_on_cell_corners", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "radians", "n_halo": 0, }, "lat": { "name": "latitude_on_cell_corners", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "radians", "n_halo": 0, }, @@ -32,13 +31,13 @@ class TranslateGnomonicGrids(ParallelTranslateGrid): outputs = { "lon": { "name": "longitude_on_cell_corners", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "radians", "n_halo": 0, }, "lat": { "name": "latitude_on_cell_corners", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "radians", "n_halo": 0, }, @@ -65,13 +64,12 @@ def compute(self, inputs): class TranslateMirrorGrid(ParallelTranslateGrid): - inputs = { "master_grid_global": { "name": "grid_global", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, MetricTerms.TILE_DIM, ], @@ -86,8 +84,8 @@ class TranslateMirrorGrid(ParallelTranslateGrid): "master_grid_global": { "name": "grid_global", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, MetricTerms.TILE_DIM, ], @@ -122,8 +120,8 @@ class TranslateGridAreas(ParallelTranslateGrid): def __init__( self, rank_grids, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(rank_grids, namelist, stencil_factory) self.max_error = 1e-10 @@ -136,77 +134,77 @@ def __init__( "grid": { "name": "grid", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, ], "units": "radians", }, "agrid": { "name": "agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], "units": "radians", }, "area": { "name": "area", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "m^2", }, "area_c": { "name": "area_cgrid", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "m^2", }, "dxa": { "name": "dx_agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "m", }, "dya": { "name": "dy_agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "m", }, "dxc": { "name": "dx_cgrid", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "m", }, "dyc": { "name": "dy_cgrid", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "m", }, } outputs = { "area": { "name": "area", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "m^2", }, "area_c": { "name": "area_cgrid", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "m^2", }, "dxa": { "name": "dx_agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "m", }, "dya": { "name": "dy_agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "m", }, "dxc": { "name": "dx_cgrid", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "m", }, "dyc": { "name": "dy_cgrid", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "m", }, } @@ -231,14 +229,13 @@ def compute_parallel(self, inputs, communicator): class TranslateGridGrid(ParallelTranslateGrid): - max_error = 1e-14 inputs: Dict[str, Any] = { "grid_global": { "name": "grid", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, MetricTerms.TILE_DIM, ], @@ -249,8 +246,8 @@ class TranslateGridGrid(ParallelTranslateGrid): "grid": { "name": "grid", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, ], "units": "radians", @@ -260,8 +257,8 @@ class TranslateGridGrid(ParallelTranslateGrid): def __init__( self, grids, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grids, namelist, stencil_factory) self.max_error = 1.0e-13 @@ -290,8 +287,8 @@ class TranslateDxDy(ParallelTranslateGrid): def __init__( self, rank_grids, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(rank_grids, namelist, stencil_factory) self.max_error = 3e-14 @@ -302,8 +299,8 @@ def __init__( "grid": { "name": "grid", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, ], "units": "radians", @@ -312,12 +309,12 @@ def __init__( outputs = { "dx": { "name": "dx", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "m", }, "dy": { "name": "dy", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "m", }, } @@ -344,8 +341,8 @@ class TranslateAGrid(ParallelTranslateGrid): def __init__( self, rank_grids, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(rank_grids, namelist, stencil_factory) self.max_error = 1e-13 @@ -355,14 +352,14 @@ def __init__( inputs = { "agrid": { "name": "agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], "units": "radians", }, "grid": { "name": "grid", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, ], "units": "radians", @@ -371,14 +368,14 @@ def __init__( outputs = { "agrid": { "name": "agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], "units": "radians", }, "grid": { "name": "grid", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, ], "units": "radians", @@ -436,55 +433,55 @@ class TranslateInitGrid(ParallelTranslateGrid): "gridvar": { "name": "grid", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, ], "units": "radians", }, "agrid": { "name": "agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], "units": "radians", }, "area": { "name": "area", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "m^2", }, "area_c": { "name": "area_cgrid", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "m^2", }, "dx": { "name": "dx", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "m", }, "dy": { "name": "dy", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "m", }, "dxc": { "name": "dx_cgrid", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "m", }, "dyc": { "name": "dy_cgrid", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "m", }, "dxa": { "name": "dx_agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "m", }, "dya": { "name": "dy_agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "m", }, } @@ -492,8 +489,8 @@ class TranslateInitGrid(ParallelTranslateGrid): def __init__( self, grids, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grids, namelist, stencil_factory) self.max_error = 3e-12 @@ -535,12 +532,12 @@ class TranslateSetEta(ParallelTranslateGrid): }, "ak": { "name": "ak", - "dims": [pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.Z_INTERFACE_DIM], "units": "mb", }, "bk": { "name": "bk", - "dims": [pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.Z_INTERFACE_DIM], "units": "", }, } @@ -552,12 +549,12 @@ class TranslateSetEta(ParallelTranslateGrid): }, "ak": { "name": "ak", - "dims": [pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.Z_INTERFACE_DIM], "units": "mb", }, "bk": { "name": "bk", - "dims": [pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.Z_INTERFACE_DIM], "units": "", }, } @@ -589,8 +586,8 @@ class TranslateUtilVectors(ParallelTranslateGrid): def __init__( self, grids, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grids, namelist, stencil_factory) self.max_error = 3e-12 @@ -636,33 +633,33 @@ def __init__( "grid": { "name": "grid", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, ], "units": "radians", }, "agrid": { "name": "agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], "units": "radians", }, "ec1": { "name": "ec1", - "dims": [MetricTerms.CARTESIAN_DIM, pace.util.X_DIM, pace.util.Y_DIM], + "dims": [MetricTerms.CARTESIAN_DIM, ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "ec2": { "name": "ec2", - "dims": [MetricTerms.CARTESIAN_DIM, pace.util.X_DIM, pace.util.Y_DIM], + "dims": [MetricTerms.CARTESIAN_DIM, ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "ew1": { "name": "ew1", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_INTERFACE_DIM, - pace.util.Y_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_DIM, ], "units": "", }, @@ -670,8 +667,8 @@ def __init__( "name": "ew2", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_INTERFACE_DIM, - pace.util.Y_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_DIM, ], "units": "", }, @@ -679,8 +676,8 @@ def __init__( "name": "es1", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_DIM, + ndsl.util.Y_INTERFACE_DIM, ], "units": "", }, @@ -688,8 +685,8 @@ def __init__( "name": "es2", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_DIM, + ndsl.util.Y_INTERFACE_DIM, ], "units": "", }, @@ -697,20 +694,20 @@ def __init__( outputs: Dict[str, Any] = { "ec1": { "name": "ec1", - "dims": [MetricTerms.CARTESIAN_DIM, pace.util.X_DIM, pace.util.Y_DIM], + "dims": [MetricTerms.CARTESIAN_DIM, ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "ec2": { "name": "ec2", - "dims": [MetricTerms.CARTESIAN_DIM, pace.util.X_DIM, pace.util.Y_DIM], + "dims": [MetricTerms.CARTESIAN_DIM, ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "ew1": { "name": "ew1", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_INTERFACE_DIM, - pace.util.Y_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_DIM, ], "units": "", }, @@ -718,8 +715,8 @@ def __init__( "name": "ew2", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_INTERFACE_DIM, - pace.util.Y_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_DIM, ], "units": "", }, @@ -727,8 +724,8 @@ def __init__( "name": "es1", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_DIM, + ndsl.util.Y_INTERFACE_DIM, ], "units": "", }, @@ -736,8 +733,8 @@ def __init__( "name": "es2", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_DIM, + ndsl.util.Y_INTERFACE_DIM, ], "units": "", }, @@ -766,8 +763,8 @@ class TranslateTrigSg(ParallelTranslateGrid): def __init__( self, grids, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grids, namelist, stencil_factory) self.max_error = 2.5e-10 @@ -804,207 +801,207 @@ def __init__( "grid": { "name": "grid", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, ], "units": "", }, "agrid": { "name": "agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], "units": "radians", }, "cos_sg1": { "name": "cos_sg1", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg1": { "name": "sin_sg1", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg2": { "name": "cos_sg2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg2": { "name": "sin_sg2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg3": { "name": "cos_sg3", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg3": { "name": "sin_sg3", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg4": { "name": "cos_sg4", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg4": { "name": "sin_sg4", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg5": { "name": "cos_sg5", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg5": { "name": "sin_sg5", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg6": { "name": "cos_sg6", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg6": { "name": "sin_sg6", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg7": { "name": "cos_sg7", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg7": { "name": "sin_sg7", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg8": { "name": "cos_sg8", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg8": { "name": "sin_sg8", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg9": { "name": "cos_sg9", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg9": { "name": "sin_sg9", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "ec1": { "name": "ec1", - "dims": [MetricTerms.CARTESIAN_DIM, pace.util.X_DIM, pace.util.Y_DIM], + "dims": [MetricTerms.CARTESIAN_DIM, ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "ec2": { "name": "ec2", - "dims": [MetricTerms.CARTESIAN_DIM, pace.util.X_DIM, pace.util.Y_DIM], + "dims": [MetricTerms.CARTESIAN_DIM, ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, } outputs: Dict[str, Any] = { "cos_sg1": { "name": "cos_sg1", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg1": { "name": "sin_sg1", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg2": { "name": "cos_sg2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg2": { "name": "sin_sg2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg3": { "name": "cos_sg3", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg3": { "name": "sin_sg3", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg4": { "name": "cos_sg4", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg4": { "name": "sin_sg4", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg5": { "name": "cos_sg5", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg5": { "name": "sin_sg5", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg6": { "name": "cos_sg6", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg6": { "name": "sin_sg6", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg7": { "name": "cos_sg7", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg7": { "name": "sin_sg7", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg8": { "name": "cos_sg8", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg8": { "name": "sin_sg8", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg9": { "name": "cos_sg9", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg9": { "name": "sin_sg9", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, } @@ -1038,8 +1035,8 @@ class TranslateAAMCorrection(ParallelTranslateGrid): def __init__( self, rank_grids, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(rank_grids, namelist, stencil_factory) self.max_error = 1e-14 @@ -1052,21 +1049,21 @@ def __init__( "grid": { "name": "grid", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, ], "units": "radians", }, "l2c_v": { "name": "l2c_v", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 0, }, "l2c_u": { "name": "l2c_u", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", "n_halo": 0, }, @@ -1074,13 +1071,13 @@ def __init__( outputs: Dict[str, Any] = { "l2c_v": { "name": "l2c_v", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 0, }, "l2c_u": { "name": "l2c_u", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", "n_halo": 0, }, @@ -1108,8 +1105,8 @@ class TranslateDerivedTrig(ParallelTranslateGrid): def __init__( self, grids, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grids, namelist, stencil_factory) self.max_error = 8.5e-14 @@ -1132,108 +1129,108 @@ def __init__( "grid": { "name": "grid", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, ], "units": "radians", }, "cos_sg1": { "name": "cos_sg1", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg1": { "name": "sin_sg1", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg2": { "name": "cos_sg2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg2": { "name": "sin_sg2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg3": { "name": "cos_sg3", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg3": { "name": "sin_sg3", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg4": { "name": "cos_sg4", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg4": { "name": "sin_sg4", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg5": { "name": "cos_sg5", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg5": { "name": "sin_sg5", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg6": { "name": "cos_sg6", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg6": { "name": "sin_sg6", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg7": { "name": "cos_sg7", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg7": { "name": "sin_sg7", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg8": { "name": "cos_sg8", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg8": { "name": "sin_sg8", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg9": { "name": "cos_sg9", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg9": { "name": "sin_sg9", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "ee1": { "name": "ee1", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, ], "units": "", }, @@ -1241,65 +1238,65 @@ def __init__( "name": "ee2", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, ], "units": "", }, "cosa_u": { "name": "cosa_u", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, "cosa_v": { "name": "cosa_v", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "cosa_s": { "name": "cosa_s", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sina_u": { "name": "sina_u", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, "sina_v": { "name": "sina_v", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "rsin_u": { "name": "rsin_u", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, "rsin_v": { "name": "rsin_v", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "rsina": { "name": "rsina", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", "n_halo": 0, }, "rsin2": { "name": "rsin2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cosa": { "name": "cosa", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "sina": { "name": "sina", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, } @@ -1308,8 +1305,8 @@ def __init__( "name": "ee1", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, ], "units": "", }, @@ -1317,65 +1314,65 @@ def __init__( "name": "ee2", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, ], "units": "", }, "cosa_u": { "name": "cosa_u", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, "cosa_v": { "name": "cosa_v", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "cosa_s": { "name": "cosa_s", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sina_u": { "name": "sina_u", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, "sina_v": { "name": "sina_v", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "rsin_u": { "name": "rsin_u", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, "rsin_v": { "name": "rsin_v", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "rsina": { "name": "rsina", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", "n_halo": 0, }, "rsin2": { "name": "rsin2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cosa": { "name": "cosa", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "sina": { "name": "sina", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, } @@ -1421,8 +1418,8 @@ class TranslateDivgDel6(ParallelTranslateGrid): def __init__( self, rank_grids, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(rank_grids, namelist, stencil_factory) self.max_error = 4e-14 @@ -1432,94 +1429,94 @@ def __init__( inputs: Dict[str, Any] = { "sin_sg1": { "name": "sin_sg1", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg2": { "name": "sin_sg2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg3": { "name": "sin_sg3", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg4": { "name": "sin_sg4", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sina_u": { "name": "sina_u", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, "sina_v": { "name": "sina_v", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "dx": { "name": "dx", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "m", }, "dy": { "name": "dy", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "m", }, "dxc": { "name": "dx_cgrid", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "m", }, "dyc": { "name": "dy_cgrid", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "divg_u": { "name": "divg_u", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "divg_v": { "name": "divg_v", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "m", }, "del6_u": { "name": "del6_u", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "del6_v": { "name": "del6_v", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, } outputs: Dict[str, Any] = { "divg_u": { "name": "divg_u", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "divg_v": { "name": "divg_v", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, "del6_u": { "name": "del6_u", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "del6_v": { "name": "del6_v", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, } @@ -1556,8 +1553,8 @@ class TranslateInitCubedtoLatLon(ParallelTranslateGrid): def __init__( self, grids, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grids, namelist, stencil_factory) self.max_error = 3.0e-14 @@ -1577,83 +1574,83 @@ def __init__( inputs: Dict[str, Any] = { "agrid": { "name": "agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], "units": "radians", }, "ec1": { "name": "ec1", - "dims": [MetricTerms.CARTESIAN_DIM, pace.util.X_DIM, pace.util.Y_DIM], + "dims": [MetricTerms.CARTESIAN_DIM, ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "ec2": { "name": "ec2", - "dims": [MetricTerms.CARTESIAN_DIM, pace.util.X_DIM, pace.util.Y_DIM], + "dims": [MetricTerms.CARTESIAN_DIM, ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg5": { "name": "sin_sg5", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, } outputs: Dict[str, Any] = { "vlon": { "name": "vlon", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, MetricTerms.CARTESIAN_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, MetricTerms.CARTESIAN_DIM], "units": "", "n_halo": 2, }, "vlat": { "name": "vlat", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, MetricTerms.CARTESIAN_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, MetricTerms.CARTESIAN_DIM], "units": "", "n_halo": 2, }, "z11": { "name": "z11", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "z12": { "name": "z12", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "z21": { "name": "z21", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "z22": { "name": "z22", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "a11": { "name": "a11", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "a12": { "name": "a12", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "a21": { "name": "a21", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "a22": { "name": "a22", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, @@ -1684,8 +1681,8 @@ class TranslateEdgeFactors(ParallelTranslateGrid): def __init__( self, rank_grids, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(rank_grids, namelist, stencil_factory) self.max_error = 3e-13 @@ -1696,105 +1693,105 @@ def __init__( "grid": { "name": "grid", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, ], "units": "radians", }, "agrid": { "name": "agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], "units": "radians", }, "edge_s": { "name": "edge_s", - "dims": [pace.util.X_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM], "units": "", "n_halo": 0, }, "edge_n": { "name": "edge_n", - "dims": [pace.util.X_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM], "units": "", "n_halo": 0, }, "edge_e": { "name": "edge_e", - "dims": [pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.Y_INTERFACE_DIM], "units": "", "n_halo": 0, }, "edge_w": { "name": "edge_w", - "dims": [pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.Y_INTERFACE_DIM], "units": "", "n_halo": 0, }, "edge_vect_s": { "name": "edge_vect_s", - "dims": [pace.util.X_DIM], + "dims": [ndsl.util.X_DIM], "units": "", }, "edge_vect_n": { "name": "edge_vect_n", - "dims": [pace.util.X_DIM], + "dims": [ndsl.util.X_DIM], "units": "", }, "edge_vect_e": { "name": "edge_vect_e", - "dims": [pace.util.Y_DIM], + "dims": [ndsl.util.Y_DIM], "units": "", }, "edge_vect_w": { "name": "edge_vect_w", - "dims": [pace.util.Y_DIM], + "dims": [ndsl.util.Y_DIM], "units": "", }, } outputs: Dict[str, Any] = { "edge_s": { "name": "edge_s", - "dims": [pace.util.X_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM], "units": "", "n_halo": 0, }, "edge_n": { "name": "edge_n", - "dims": [pace.util.X_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM], "units": "", "n_halo": 0, }, "edge_e": { "name": "edge_e", - "dims": [pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.Y_INTERFACE_DIM], "units": "", "n_halo": 0, }, "edge_w": { "name": "edge_w", - "dims": [pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.Y_INTERFACE_DIM], "units": "", "n_halo": 0, }, "edge_vect_s": { "name": "edge_vect_s", - "dims": [pace.util.X_DIM], + "dims": [ndsl.util.X_DIM], "units": "", }, "edge_vect_n": { "name": "edge_vect_n", - "dims": [pace.util.X_DIM], + "dims": [ndsl.util.X_DIM], "units": "", }, "edge_vect_e": { "name": "edge_vect_e", - "dims": [pace.util.Y_DIM], + "dims": [ndsl.util.Y_DIM], "units": "", }, "edge_vect_w": { "name": "edge_vect_w", - "dims": [pace.util.Y_DIM], + "dims": [ndsl.util.Y_DIM], "units": "", }, } @@ -1823,8 +1820,8 @@ class TranslateInitGridUtils(ParallelTranslateGrid): def __init__( self, grids, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grids, namelist, stencil_factory) self.max_error = 2.5e-10 @@ -1888,55 +1885,55 @@ def __init__( "gridvar": { "name": "grid", "dims": [ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, MetricTerms.LON_OR_LAT_DIM, ], "units": "radians", }, "agrid": { "name": "agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, MetricTerms.LON_OR_LAT_DIM], "units": "radians", }, "area": { "name": "area", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "m^2", }, "area_c": { "name": "area_cgrid", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "m^2", }, "dx": { "name": "dx", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "m", }, "dy": { "name": "dy", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "m", }, "dxc": { "name": "dx_cgrid", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "m", }, "dyc": { "name": "dy_cgrid", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "m", }, "dxa": { "name": "dx_agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "m", }, "dya": { "name": "dy_agrid", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "m", }, "npz": { @@ -1958,30 +1955,30 @@ def __init__( }, "ak": { "name": "ak", - "dims": [pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.Z_INTERFACE_DIM], "units": "mb", }, "bk": { "name": "bk", - "dims": [pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.Z_INTERFACE_DIM], "units": "", }, "ec1": { "name": "ec1", - "dims": [MetricTerms.CARTESIAN_DIM, pace.util.X_DIM, pace.util.Y_DIM], + "dims": [MetricTerms.CARTESIAN_DIM, ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "ec2": { "name": "ec2", - "dims": [MetricTerms.CARTESIAN_DIM, pace.util.X_DIM, pace.util.Y_DIM], + "dims": [MetricTerms.CARTESIAN_DIM, ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "ew1": { "name": "ew1", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_INTERFACE_DIM, - pace.util.Y_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_DIM, ], "units": "", }, @@ -1989,8 +1986,8 @@ def __init__( "name": "ew2", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_INTERFACE_DIM, - pace.util.Y_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_DIM, ], "units": "", }, @@ -1998,8 +1995,8 @@ def __init__( "name": "es1", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_DIM, + ndsl.util.Y_INTERFACE_DIM, ], "units": "", }, @@ -2007,110 +2004,110 @@ def __init__( "name": "es2", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_DIM, + ndsl.util.Y_INTERFACE_DIM, ], "units": "", }, "cos_sg1": { "name": "cos_sg1", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg1": { "name": "sin_sg1", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg2": { "name": "cos_sg2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg2": { "name": "sin_sg2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg3": { "name": "cos_sg3", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg3": { "name": "sin_sg3", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg4": { "name": "cos_sg4", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg4": { "name": "sin_sg4", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg5": { "name": "cos_sg5", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg5": { "name": "sin_sg5", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg6": { "name": "cos_sg6", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg6": { "name": "sin_sg6", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg7": { "name": "cos_sg7", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg7": { "name": "sin_sg7", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg8": { "name": "cos_sg8", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg8": { "name": "sin_sg8", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cos_sg9": { "name": "cos_sg9", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sin_sg9": { "name": "sin_sg9", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "l2c_v": { "name": "l2c_v", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 0, }, "l2c_u": { "name": "l2c_u", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", "n_halo": 0, }, @@ -2118,8 +2115,8 @@ def __init__( "name": "ee1", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, ], "units": "", }, @@ -2127,165 +2124,165 @@ def __init__( "name": "ee2", "dims": [ MetricTerms.CARTESIAN_DIM, - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, ], "units": "", }, "cosa_u": { "name": "cosa_u", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, "cosa_v": { "name": "cosa_v", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "cosa_s": { "name": "cosa_s", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "sina_u": { "name": "sina_u", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, "sina_v": { "name": "sina_v", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "rsin_u": { "name": "rsin_u", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, "rsin_v": { "name": "rsin_v", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "rsina": { "name": "rsina", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", "n_halo": 0, }, "rsin2": { "name": "rsin2", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", }, "cosa": { "name": "cosa", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "sina": { "name": "sina", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "divg_u": { "name": "divg_u", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "divg_v": { "name": "divg_v", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, "del6_u": { "name": "del6_u", - "dims": [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], "units": "", }, "del6_v": { "name": "del6_v", - "dims": [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], "units": "", }, "vlon": { "name": "vlon", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, MetricTerms.CARTESIAN_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, MetricTerms.CARTESIAN_DIM], "units": "", "n_halo": 2, }, "vlat": { "name": "vlat", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, MetricTerms.CARTESIAN_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, MetricTerms.CARTESIAN_DIM], "units": "", "n_halo": 2, }, "z11": { "name": "z11", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "z12": { "name": "z12", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "z21": { "name": "z21", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "z22": { "name": "z22", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "a11": { "name": "a11", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "a12": { "name": "a12", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "a21": { "name": "a21", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "a22": { "name": "a22", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "", "n_halo": 1, }, "edge_vect_s": { "name": "edge_vect_s", - "dims": [pace.util.X_DIM], + "dims": [ndsl.util.X_DIM], "units": "", }, "edge_vect_n": { "name": "edge_vect_n", - "dims": [pace.util.X_DIM], + "dims": [ndsl.util.X_DIM], "units": "", }, "edge_vect_e": { "name": "edge_vect_e", - "dims": [pace.util.Y_DIM], + "dims": [ndsl.util.Y_DIM], "units": "", }, "edge_vect_w": { "name": "edge_vect_w", - "dims": [pace.util.Y_DIM], + "dims": [ndsl.util.Y_DIM], "units": "", }, "da_min": { diff --git a/fv3core/tests/savepoint/translate/translate_haloupdate.py b/fv3core/tests/savepoint/translate/translate_haloupdate.py index e0a66f16..0a5598f7 100644 --- a/fv3core/tests/savepoint/translate/translate_haloupdate.py +++ b/fv3core/tests/savepoint/translate/translate_haloupdate.py @@ -1,19 +1,17 @@ -import pace.dsl -import pace.util -import pace.util as fv3util -from pace.dsl import gt4py_utils as utils -from pace.stencils.testing import ParallelTranslate -from pace.util.logging import pace_log +import ndsl.dsl +import ndsl.util +import ndsl.util as fv3util +from ndsl.stencils.testing import ParallelTranslate +from ndsl.util.logging import pace_log class TranslateHaloUpdate(ParallelTranslate): - inputs = { "array": { "name": "air_temperature", "dims": [fv3util.X_DIM, fv3util.Y_DIM, fv3util.Z_DIM], "units": "degK", - "n_halo": utils.halo, + "n_halo": ndsl.util.N_HALO_DEFAULT, } } @@ -22,7 +20,7 @@ class TranslateHaloUpdate(ParallelTranslate): "name": "air_temperature", "dims": [fv3util.X_DIM, fv3util.Y_DIM, fv3util.Z_DIM], "units": "degK", - "n_halo": utils.halo, + "n_halo": ndsl.util.N_HALO_DEFAULT, } } halo_update_varname = "air_temperature" @@ -30,15 +28,15 @@ class TranslateHaloUpdate(ParallelTranslate): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) def compute_parallel(self, inputs, communicator): state = self.state_from_inputs(inputs) req = communicator.start_halo_update( - state[self.halo_update_varname], n_points=utils.halo + state[self.halo_update_varname], n_points=fv3util.N_HALO_DEFAULT ) req.wait() return self.outputs_from_state(state) @@ -50,7 +48,7 @@ def compute_sequential(self, inputs_list, communicator_list): pace_log.debug(f"starting on {communicator.rank}") req_list.append( communicator.start_halo_update( - state[self.halo_update_varname], n_points=utils.halo + state[self.halo_update_varname], n_points=fv3util.N_HALO_DEFAULT ) ) for communicator, req in zip(communicator_list, req_list): @@ -60,13 +58,12 @@ def compute_sequential(self, inputs_list, communicator_list): class TranslateHaloUpdate_2(TranslateHaloUpdate): - inputs = { "array2": { "name": "height_on_interface_levels", "dims": [fv3util.X_DIM, fv3util.Y_DIM, fv3util.Z_INTERFACE_DIM], "units": "m", - "n_halo": utils.halo, + "n_halo": fv3util.N_HALO_DEFAULT, } } @@ -75,7 +72,7 @@ class TranslateHaloUpdate_2(TranslateHaloUpdate): "name": "height_on_interface_levels", "dims": [fv3util.X_DIM, fv3util.Y_DIM, fv3util.Z_INTERFACE_DIM], "units": "m", - "n_halo": utils.halo, + "n_halo": fv3util.N_HALO_DEFAULT, } } @@ -83,13 +80,12 @@ class TranslateHaloUpdate_2(TranslateHaloUpdate): class TranslateMPPUpdateDomains(TranslateHaloUpdate): - inputs = { "update_arr": { "name": "z_wind_as_tendency_of_pressure", "dims": [fv3util.X_DIM, fv3util.Y_DIM, fv3util.Z_DIM], "units": "Pa/s", - "n_halo": utils.halo, + "n_halo": fv3util.N_HALO_DEFAULT, } } @@ -98,7 +94,7 @@ class TranslateMPPUpdateDomains(TranslateHaloUpdate): "name": "z_wind_as_tendency_of_pressure", "dims": [fv3util.X_DIM, fv3util.Y_DIM, fv3util.Z_DIM], "units": "Pa/s", - "n_halo": utils.halo, + "n_halo": fv3util.N_HALO_DEFAULT, } } @@ -106,19 +102,18 @@ class TranslateMPPUpdateDomains(TranslateHaloUpdate): class TranslateHaloVectorUpdate(ParallelTranslate): - inputs = { "array_u": { "name": "x_wind_on_c_grid", "dims": [fv3util.X_INTERFACE_DIM, fv3util.Y_DIM, fv3util.Z_DIM], "units": "m/s", - "n_halo": utils.halo, + "n_halo": fv3util.N_HALO_DEFAULT, }, "array_v": { "name": "y_wind_on_c_grid", "dims": [fv3util.X_DIM, fv3util.Y_INTERFACE_DIM, fv3util.Z_DIM], "units": "m/s", - "n_halo": utils.halo, + "n_halo": fv3util.N_HALO_DEFAULT, }, } @@ -127,21 +122,21 @@ class TranslateHaloVectorUpdate(ParallelTranslate): "name": "x_wind_on_c_grid", "dims": [fv3util.X_INTERFACE_DIM, fv3util.Y_DIM, fv3util.Z_DIM], "units": "m/s", - "n_halo": utils.halo, + "n_halo": fv3util.N_HALO_DEFAULT, }, "array_v": { "name": "y_wind_on_c_grid", "dims": [fv3util.X_DIM, fv3util.Y_INTERFACE_DIM, fv3util.Z_DIM], "units": "m/s", - "n_halo": utils.halo, + "n_halo": fv3util.N_HALO_DEFAULT, }, } def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super(TranslateHaloVectorUpdate, self).__init__(grid, namelist, stencil_factory) @@ -149,7 +144,9 @@ def compute_parallel(self, inputs, communicator): pace_log.debug(f"starting on {communicator.rank}") state = self.state_from_inputs(inputs) req = communicator.start_vector_halo_update( - state["x_wind_on_c_grid"], state["y_wind_on_c_grid"], n_points=utils.halo + state["x_wind_on_c_grid"], + state["y_wind_on_c_grid"], + n_points=fv3util.N_HALO_DEFAULT, ) pace_log.debug(f"finishing on {communicator.rank}") @@ -165,7 +162,7 @@ def compute_sequential(self, inputs_list, communicator_list): communicator.start_vector_halo_update( state["x_wind_on_c_grid"], state["y_wind_on_c_grid"], - n_points=utils.halo, + n_points=fv3util.N_HALO_DEFAULT, ) ) for communicator, req in zip(communicator_list, req_list): @@ -175,19 +172,18 @@ def compute_sequential(self, inputs_list, communicator_list): class TranslateMPPBoundaryAdjust(ParallelTranslate): - inputs = { "u": { "name": "x_wind_on_d_grid", "dims": [fv3util.X_DIM, fv3util.Y_INTERFACE_DIM, fv3util.Z_DIM], "units": "m/s", - "n_halo": utils.halo, + "n_halo": fv3util.N_HALO_DEFAULT, }, "v": { "name": "y_wind_on_d_grid", "dims": [fv3util.X_INTERFACE_DIM, fv3util.Y_DIM, fv3util.Z_DIM], "units": "m/s", - "n_halo": utils.halo, + "n_halo": fv3util.N_HALO_DEFAULT, }, } @@ -196,21 +192,21 @@ class TranslateMPPBoundaryAdjust(ParallelTranslate): "name": "x_wind_on_d_grid", "dims": [fv3util.X_DIM, fv3util.Y_INTERFACE_DIM, fv3util.Z_DIM], "units": "m/s", - "n_halo": utils.halo, + "n_halo": fv3util.N_HALO_DEFAULT, }, "v": { "name": "y_wind_on_d_grid", "dims": [fv3util.X_INTERFACE_DIM, fv3util.Y_DIM, fv3util.Z_DIM], "units": "m/s", - "n_halo": utils.halo, + "n_halo": fv3util.N_HALO_DEFAULT, }, } def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super(TranslateMPPBoundaryAdjust, self).__init__( grid, namelist, stencil_factory diff --git a/fv3core/tests/savepoint/translate/translate_init_case.py b/fv3core/tests/savepoint/translate/translate_init_case.py index 90655529..85ff0c9c 100644 --- a/fv3core/tests/savepoint/translate/translate_init_case.py +++ b/fv3core/tests/savepoint/translate/translate_init_case.py @@ -3,17 +3,17 @@ import numpy as np import pytest -import pace.dsl -import pace.dsl.gt4py_utils as utils +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +import ndsl.util as fv3util import pace.fv3core.initialization.analytic_init as analytic_init import pace.fv3core.initialization.init_utils as init_utils import pace.fv3core.initialization.test_cases.initialize_baroclinic as baroclinic_init -import pace.util -import pace.util as fv3util +from ndsl.stencils.testing import ParallelTranslateBaseSlicing +from ndsl.stencils.testing.grid import TRACER_DIM # type: ignore +from ndsl.util.grid import GridData, MetricTerms from pace.fv3core.testing import TranslateDycoreFortranData2Py -from pace.stencils.testing import ParallelTranslateBaseSlicing -from pace.stencils.testing.grid import TRACER_DIM # type: ignore -from pace.util.grid import GridData, MetricTerms class TranslateInitCase(ParallelTranslateBaseSlicing): @@ -112,8 +112,8 @@ class TranslateInitCase(ParallelTranslateBaseSlicing): def __init__( self, grid_list, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid_list, namelist, stencil_factory) grid = grid_list[0] @@ -184,7 +184,7 @@ def compute_parallel(self, inputs, communicator): state = {} full_shape = ( *self.grid.domain_shape_full(add=(1, 1, 1)), - pace.util.constants.NQ, + ndsl.util.constants.NQ, ) for variable, properties in self.outputs.items(): dims = properties["dims"] @@ -205,18 +205,18 @@ def compute_parallel(self, inputs, communicator): backend=self.stencil_factory.backend, ) - sizer = pace.util.SubtileGridSizer.from_tile_params( + sizer = ndsl.util.SubtileGridSizer.from_tile_params( nx_tile=self.namelist.nx_tile, ny_tile=self.namelist.nx_tile, nz=self.namelist.nz, - n_halo=pace.util.N_HALO_DEFAULT, + n_halo=ndsl.util.N_HALO_DEFAULT, extra_dim_lengths={}, layout=self.namelist.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, ) - quantity_factory = pace.util.QuantityFactory.from_backend( + quantity_factory = ndsl.util.QuantityFactory.from_backend( sizer, backend=self.stencil_factory.backend ) @@ -257,8 +257,8 @@ class TranslateInitPreJab(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = {"ak": {}, "bk": {}, "delp": {}} @@ -316,8 +316,8 @@ class TranslateJablonowskiBaroclinic(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { @@ -398,8 +398,8 @@ class TranslatePVarAuxiliaryPressureVars(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { diff --git a/fv3core/tests/savepoint/translate/translate_last_step.py b/fv3core/tests/savepoint/translate/translate_last_step.py index bebb525c..edd02fc0 100644 --- a/fv3core/tests/savepoint/translate/translate_last_step.py +++ b/fv3core/tests/savepoint/translate/translate_last_step.py @@ -1,6 +1,6 @@ -import pace.dsl +import ndsl.dsl +import ndsl.util import pace.fv3core.stencils.moist_cv as moist_cv -import pace.util from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -8,8 +8,8 @@ class TranslateLastStep(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.compute_func = stencil_factory.from_origin_domain( # type: ignore diff --git a/fv3core/tests/savepoint/translate/translate_moistcvpluspkz_2d.py b/fv3core/tests/savepoint/translate/translate_moistcvpluspkz_2d.py index 26dff791..fae5c183 100644 --- a/fv3core/tests/savepoint/translate/translate_moistcvpluspkz_2d.py +++ b/fv3core/tests/savepoint/translate/translate_moistcvpluspkz_2d.py @@ -1,9 +1,9 @@ import pace.fv3core.stencils.moist_cv as moist_cv -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import FloatField +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import FloatField +from ndsl.stencils.testing import pad_field_in_j +from ndsl.util import Namelist from pace.fv3core.testing import TranslateDycoreFortranData2Py -from pace.stencils.testing import pad_field_in_j -from pace.util import Namelist class MoistPKZ: @@ -40,7 +40,6 @@ def __call__( delz: FloatField, r_vir: float, ): - self._moist_cv_pkz( qvapor, qliquid, diff --git a/fv3core/tests/savepoint/translate/translate_moistcvpluspt_2d.py b/fv3core/tests/savepoint/translate/translate_moistcvpluspt_2d.py index c0d2c937..bb678cdd 100644 --- a/fv3core/tests/savepoint/translate/translate_moistcvpluspt_2d.py +++ b/fv3core/tests/savepoint/translate/translate_moistcvpluspt_2d.py @@ -1,9 +1,9 @@ from gt4py.cartesian.gtscript import PARALLEL, computation, interval import pace.fv3core.stencils.moist_cv as moist_cv -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import FloatField -from pace.stencils.testing import TranslateFortranData2Py, pad_field_in_j +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import FloatField +from ndsl.stencils.testing import TranslateFortranData2Py, pad_field_in_j def moist_pt( diff --git a/fv3core/tests/savepoint/translate/translate_neg_adj3.py b/fv3core/tests/savepoint/translate/translate_neg_adj3.py index fb05fd63..8dfc8a5f 100644 --- a/fv3core/tests/savepoint/translate/translate_neg_adj3.py +++ b/fv3core/tests/savepoint/translate/translate_neg_adj3.py @@ -1,8 +1,8 @@ from typing import Any, Dict -import pace.dsl -import pace.dsl.gt4py_utils as utils -import pace.util +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util from pace.fv3core.stencils.neg_adj3 import AdjustNegativeTracerMixingRatio from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -11,8 +11,8 @@ class TranslateNeg_Adj3(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { diff --git a/fv3core/tests/savepoint/translate/translate_nh_p_grad.py b/fv3core/tests/savepoint/translate/translate_nh_p_grad.py index 6047a095..458b3869 100644 --- a/fv3core/tests/savepoint/translate/translate_nh_p_grad.py +++ b/fv3core/tests/savepoint/translate/translate_nh_p_grad.py @@ -1,6 +1,6 @@ -import pace.dsl +import ndsl.dsl +import ndsl.util import pace.fv3core.stencils.nh_p_grad as NH_P_Grad -import pace.util from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -10,8 +10,8 @@ class TranslateNH_P_Grad(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { diff --git a/fv3core/tests/savepoint/translate/translate_pe_halo.py b/fv3core/tests/savepoint/translate/translate_pe_halo.py index f807e9d3..5d5a9e8b 100644 --- a/fv3core/tests/savepoint/translate/translate_pe_halo.py +++ b/fv3core/tests/savepoint/translate/translate_pe_halo.py @@ -1,5 +1,5 @@ -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util from pace.fv3core.stencils import pe_halo from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -26,10 +26,9 @@ class TranslatePE_Halo(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): - super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { "pe": { diff --git a/fv3core/tests/savepoint/translate/translate_pk3_halo.py b/fv3core/tests/savepoint/translate/translate_pk3_halo.py index 739a204a..bc9ca50d 100644 --- a/fv3core/tests/savepoint/translate/translate_pk3_halo.py +++ b/fv3core/tests/savepoint/translate/translate_pk3_halo.py @@ -1,5 +1,5 @@ -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util from pace.fv3core.stencils.pk3_halo import PK3Halo from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -8,8 +8,8 @@ class TranslatePK3_Halo(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.stencil_factory = stencil_factory diff --git a/fv3core/tests/savepoint/translate/translate_pressureadjustedtemperature_nonhydrostatic.py b/fv3core/tests/savepoint/translate/translate_pressureadjustedtemperature_nonhydrostatic.py index 536f6c7b..99ec10ba 100644 --- a/fv3core/tests/savepoint/translate/translate_pressureadjustedtemperature_nonhydrostatic.py +++ b/fv3core/tests/savepoint/translate/translate_pressureadjustedtemperature_nonhydrostatic.py @@ -1,6 +1,8 @@ -import pace.dsl +from typing import Any, Dict + +import ndsl.dsl +import ndsl.util import pace.fv3core -import pace.util from pace.fv3core.stencils import temperature_adjust from pace.fv3core.stencils.dyn_core import get_nk_heat_dissipation from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -12,8 +14,8 @@ class TranslatePressureAdjustedTemperature_NonHydrostatic( def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) dycore_config = pace.fv3core.DynamicalCoreConfig.from_namelist(namelist) @@ -37,7 +39,7 @@ def __init__( "heat_source": {"serialname": "heat_source_dyn"}, } self.in_vars["parameters"] = ["bdt"] - self.out_vars = {"pt": {}} + self.out_vars: Dict[str, Dict[Any, Any]] = {"pt": {}} self.stencil_factory = stencil_factory def compute_from_storage(self, inputs): diff --git a/fv3core/tests/savepoint/translate/translate_qsinit.py b/fv3core/tests/savepoint/translate/translate_qsinit.py index d9f145ec..31500458 100644 --- a/fv3core/tests/savepoint/translate/translate_qsinit.py +++ b/fv3core/tests/savepoint/translate/translate_qsinit.py @@ -1,9 +1,9 @@ import numpy as np -import pace.dsl -import pace.dsl.gt4py_utils as utils +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util import pace.fv3core.stencils.saturation_adjustment as satadjust -import pace.util from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -11,8 +11,8 @@ class TranslateQSInit(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { diff --git a/fv3core/tests/savepoint/translate/translate_ray_fast.py b/fv3core/tests/savepoint/translate/translate_ray_fast.py index 5b8c069b..d1847ac0 100644 --- a/fv3core/tests/savepoint/translate/translate_ray_fast.py +++ b/fv3core/tests/savepoint/translate/translate_ray_fast.py @@ -1,5 +1,5 @@ -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util from pace.fv3core.stencils.ray_fast import RayleighDamping from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -8,8 +8,8 @@ class TranslateRay_Fast(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.compute_func = RayleighDamping( # type: ignore diff --git a/fv3core/tests/savepoint/translate/translate_remapping.py b/fv3core/tests/savepoint/translate/translate_remapping.py index 9a2e1f84..058bb90f 100644 --- a/fv3core/tests/savepoint/translate/translate_remapping.py +++ b/fv3core/tests/savepoint/translate/translate_remapping.py @@ -1,18 +1,18 @@ -import pace.dsl -import pace.dsl.gt4py_utils as utils -import pace.util +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +from ndsl.util import Z_DIM from pace.fv3core import DynamicalCoreConfig from pace.fv3core.stencils.remapping import LagrangianToEulerian from pace.fv3core.testing import TranslateDycoreFortranData2Py -from pace.util import Z_DIM class TranslateRemapping(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { diff --git a/fv3core/tests/savepoint/translate/translate_riem_solver3.py b/fv3core/tests/savepoint/translate/translate_riem_solver3.py index 70840bd0..16c582a5 100644 --- a/fv3core/tests/savepoint/translate/translate_riem_solver3.py +++ b/fv3core/tests/savepoint/translate/translate_riem_solver3.py @@ -1,5 +1,5 @@ -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util from pace.fv3core import _config as spec from pace.fv3core.stencils.riem_solver3 import NonhydrostaticVerticalSolver from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -9,8 +9,8 @@ class TranslateRiem_Solver3(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.vertical_solver = NonhydrostaticVerticalSolver( diff --git a/fv3core/tests/savepoint/translate/translate_riem_solver_c.py b/fv3core/tests/savepoint/translate/translate_riem_solver_c.py index 16261789..01256311 100644 --- a/fv3core/tests/savepoint/translate/translate_riem_solver_c.py +++ b/fv3core/tests/savepoint/translate/translate_riem_solver_c.py @@ -1,5 +1,5 @@ -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util from pace.fv3core.stencils.riem_solver_c import NonhydrostaticVerticalSolverCGrid from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -8,8 +8,8 @@ class TranslateRiem_Solver_C(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.compute_func = NonhydrostaticVerticalSolverCGrid( # type: ignore diff --git a/fv3core/tests/savepoint/translate/translate_satadjust3d.py b/fv3core/tests/savepoint/translate/translate_satadjust3d.py index a3022026..21e1a6f6 100644 --- a/fv3core/tests/savepoint/translate/translate_satadjust3d.py +++ b/fv3core/tests/savepoint/translate/translate_satadjust3d.py @@ -1,6 +1,6 @@ -import pace.dsl +import ndsl.dsl +import ndsl.util import pace.fv3core -import pace.util from pace.fv3core import DynamicalCoreConfig from pace.fv3core.stencils.saturation_adjustment import SatAdjust3d from pace.fv3core.testing import TranslateDycoreFortranData2Py @@ -10,8 +10,8 @@ class TranslateSatAdjust3d(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { diff --git a/fv3core/tests/savepoint/translate/translate_tracer2d1l.py b/fv3core/tests/savepoint/translate/translate_tracer2d1l.py index 994eabd6..c2551b2b 100644 --- a/fv3core/tests/savepoint/translate/translate_tracer2d1l.py +++ b/fv3core/tests/savepoint/translate/translate_tracer2d1l.py @@ -1,13 +1,13 @@ import pytest -import pace.dsl -import pace.dsl.gt4py_utils as utils +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +import ndsl.util as fv3util import pace.fv3core.stencils.fvtp2d import pace.fv3core.stencils.tracer_2d_1l -import pace.util -import pace.util as fv3util +from ndsl.stencils.testing import ParallelTranslate from pace.fv3core.utils.functional_validation import get_subset_func -from pace.stencils.testing import ParallelTranslate class TranslateTracer2D1L(ParallelTranslate): @@ -21,8 +21,8 @@ class TranslateTracer2D1L(ParallelTranslate): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self._base.in_vars["data_vars"] = { @@ -48,7 +48,6 @@ def collect_input_data(self, serializer, savepoint): return input_data def compute_parallel(self, inputs, communicator): - self._base.make_storage_data_input_vars(inputs) all_tracers = inputs["tracers"] inputs["tracers"] = self.get_advected_tracer_dict( diff --git a/fv3core/tests/savepoint/translate/translate_updatedzc.py b/fv3core/tests/savepoint/translate/translate_updatedzc.py index ab0d11fa..1c9e8340 100644 --- a/fv3core/tests/savepoint/translate/translate_updatedzc.py +++ b/fv3core/tests/savepoint/translate/translate_updatedzc.py @@ -1,8 +1,8 @@ import numpy as np -import pace.dsl +import ndsl.dsl +import ndsl.util import pace.fv3core.stencils.updatedzc as updatedzc -import pace.util from pace.fv3core.testing import TranslateDycoreFortranData2Py from pace.fv3core.utils.functional_validation import get_subset_func @@ -11,8 +11,8 @@ class TranslateUpdateDzC(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.stencil_factory = stencil_factory @@ -43,12 +43,12 @@ def compute(**kwargs): } self._subset = get_subset_func( self.grid.grid_indexing, - dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], n_halo=((0, 0), (0, 0)), ) self._subset_2d = get_subset_func( self.grid.grid_indexing, - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], n_halo=((0, 0), (0, 0)), ) diff --git a/fv3core/tests/savepoint/translate/translate_updatedzd.py b/fv3core/tests/savepoint/translate/translate_updatedzd.py index 83ba701a..6e573034 100644 --- a/fv3core/tests/savepoint/translate/translate_updatedzd.py +++ b/fv3core/tests/savepoint/translate/translate_updatedzd.py @@ -1,9 +1,9 @@ import numpy as np -import pace.dsl +import ndsl.dsl +import ndsl.util import pace.fv3core import pace.fv3core.stencils.updatedzd -import pace.util from pace.fv3core.stencils import d_sw from pace.fv3core.testing import TranslateDycoreFortranData2Py from pace.fv3core.utils.functional_validation import get_subset_func @@ -13,8 +13,8 @@ class TranslateUpdateDzD(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { @@ -52,7 +52,7 @@ def __init__( self.namelist = pace.fv3core.DynamicalCoreConfig.from_namelist(namelist) self._subset = get_subset_func( self.grid.grid_indexing, - dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], n_halo=((0, 0), (0, 0)), ) self.ignore_near_zero_errors = {"zh": True, "wsd": True} diff --git a/fv3core/tests/savepoint/translate/translate_xppm.py b/fv3core/tests/savepoint/translate/translate_xppm.py index 9809faf0..b9a55aef 100644 --- a/fv3core/tests/savepoint/translate/translate_xppm.py +++ b/fv3core/tests/savepoint/translate/translate_xppm.py @@ -1,17 +1,17 @@ -import pace.dsl -import pace.dsl.gt4py_utils as utils -import pace.util +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +from ndsl.stencils.testing import TranslateGrid from pace.fv3core.stencils import xppm from pace.fv3core.testing import TranslateDycoreFortranData2Py -from pace.stencils.testing import TranslateGrid class TranslateXPPM(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { @@ -62,8 +62,8 @@ class TranslateXPPM_2(TranslateXPPM): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"]["q"]["serialname"] = "q" diff --git a/fv3core/tests/savepoint/translate/translate_xtp_u.py b/fv3core/tests/savepoint/translate/translate_xtp_u.py index 39832a3d..b6de685e 100644 --- a/fv3core/tests/savepoint/translate/translate_xtp_u.py +++ b/fv3core/tests/savepoint/translate/translate_xtp_u.py @@ -1,11 +1,11 @@ from gt4py.cartesian.gtscript import PARALLEL, computation, interval -import pace.dsl +import ndsl.dsl +import ndsl.util import pace.fv3core.stencils.xtp_u as xtp_u -import pace.util -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import FloatField, FloatFieldIJ -from pace.util.grid import GridData +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import FloatField, FloatFieldIJ +from ndsl.util.grid import GridData from .translate_ytp_v import TranslateYTP_V @@ -79,8 +79,8 @@ class TranslateXTP_U(TranslateYTP_V): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"]["u"] = {} diff --git a/fv3core/tests/savepoint/translate/translate_yppm.py b/fv3core/tests/savepoint/translate/translate_yppm.py index 175be9bb..0ffedb7b 100644 --- a/fv3core/tests/savepoint/translate/translate_yppm.py +++ b/fv3core/tests/savepoint/translate/translate_yppm.py @@ -1,18 +1,18 @@ -import pace.dsl -import pace.dsl.gt4py_utils as utils -import pace.util -from pace.dsl.typing import Float +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +from ndsl.dsl.typing import Float +from ndsl.stencils.testing import TranslateGrid from pace.fv3core.stencils import yppm from pace.fv3core.testing import TranslateDycoreFortranData2Py -from pace.stencils.testing import TranslateGrid class TranslateYPPM(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"] = { @@ -66,8 +66,8 @@ class TranslateYPPM_2(TranslateYPPM): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.in_vars["data_vars"]["q"]["serialname"] = "q_2" diff --git a/fv3core/tests/savepoint/translate/translate_ytp_v.py b/fv3core/tests/savepoint/translate/translate_ytp_v.py index bf0afd16..26b523d7 100644 --- a/fv3core/tests/savepoint/translate/translate_ytp_v.py +++ b/fv3core/tests/savepoint/translate/translate_ytp_v.py @@ -1,13 +1,13 @@ from gt4py.cartesian.gtscript import PARALLEL, computation, interval -import pace.dsl +import ndsl.dsl +import ndsl.util import pace.fv3core import pace.fv3core.stencils.ytp_v as ytp_v -import pace.util -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import FloatField, FloatFieldIJ +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import FloatField, FloatFieldIJ +from ndsl.util.grid import GridData from pace.fv3core.testing import TranslateDycoreFortranData2Py -from pace.util.grid import GridData def ytp_v_stencil_defn( @@ -74,8 +74,8 @@ class TranslateYTP_V(TranslateDycoreFortranData2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) c_info = self.grid.compute_dict_buffer_2d() diff --git a/ndsl/.gitmodules b/ndsl/.gitmodules new file mode 100644 index 00000000..60de021d --- /dev/null +++ b/ndsl/.gitmodules @@ -0,0 +1,6 @@ +[submodule "external/gt4py"] + path = external/gt4py + url = https://github.com/gridtools/gt4py.git +[submodule "external/dace"] + path = external/dace + url = https://github.com/spcl/dace.git diff --git a/util/examples/mpi/.gitignore b/ndsl/examples/mpi/.gitignore similarity index 100% rename from util/examples/mpi/.gitignore rename to ndsl/examples/mpi/.gitignore diff --git a/util/examples/mpi/global_timings.py b/ndsl/examples/mpi/global_timings.py similarity index 98% rename from util/examples/mpi/global_timings.py rename to ndsl/examples/mpi/global_timings.py index 91ef70e3..3cbe20ba 100644 --- a/util/examples/mpi/global_timings.py +++ b/ndsl/examples/mpi/global_timings.py @@ -3,7 +3,7 @@ import numpy as np from mpi4py import MPI -from pace.util import Timer +from ndsl.util import Timer @contextlib.contextmanager diff --git a/util/examples/mpi/zarr_monitor.py b/ndsl/examples/mpi/zarr_monitor.py similarity index 75% rename from util/examples/mpi/zarr_monitor.py rename to ndsl/examples/mpi/zarr_monitor.py index 34702974..05f2f481 100644 --- a/util/examples/mpi/zarr_monitor.py +++ b/ndsl/examples/mpi/zarr_monitor.py @@ -5,19 +5,19 @@ import zarr from mpi4py import MPI -import pace.util +import ndsl.util OUTPUT_PATH = "output/zarr_monitor.zarr" def get_example_state(time): - sizer = pace.util.SubtileGridSizer( + sizer = ndsl.util.SubtileGridSizer( nx=48, ny=48, nz=70, n_halo=3, extra_dim_lengths={} ) - allocator = pace.util.QuantityFactory(sizer, np) + allocator = ndsl.util.QuantityFactory(sizer, np) air_temperature = allocator.zeros( - [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], units="degK" + [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], units="degK" ) air_temperature.view[:] = np.random.randn(*air_temperature.extent) return {"time": time, "air_temperature": air_temperature} @@ -30,8 +30,8 @@ def get_example_state(time): layout = (ranks_per_edge, ranks_per_edge) store = zarr.storage.DirectoryStore(OUTPUT_PATH) - partitioner = pace.util.CubedSpherePartitioner(pace.util.TilePartitioner(layout)) - monitor = pace.util.ZarrMonitor(store, partitioner, mpi_comm=MPI.COMM_WORLD) + partitioner = ndsl.util.CubedSpherePartitioner(ndsl.util.TilePartitioner(layout)) + monitor = ndsl.util.ZarrMonitor(store, partitioner, mpi_comm=MPI.COMM_WORLD) time = cftime.DatetimeJulian(2020, 1, 1) timestep = timedelta(hours=1) diff --git a/util/mypy.ini b/ndsl/mypy.ini similarity index 100% rename from util/mypy.ini rename to ndsl/mypy.ini diff --git a/ndsl/ndsl/__init__.py b/ndsl/ndsl/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/dsl/pace/dsl/__init__.py b/ndsl/ndsl/dsl/__init__.py similarity index 94% rename from dsl/pace/dsl/__init__.py rename to ndsl/ndsl/dsl/__init__.py index 9718e401..cab464e6 100644 --- a/dsl/pace/dsl/__init__.py +++ b/ndsl/ndsl/dsl/__init__.py @@ -1,6 +1,6 @@ import gt4py.cartesian.config -from pace.util.mpi import MPI +from ndsl.util.mpi import MPI from . import dace from .dace.dace_config import DaceConfig, DaCeOrchestration diff --git a/dsl/pace/dsl/caches/cache_location.py b/ndsl/ndsl/dsl/caches/cache_location.py similarity index 94% rename from dsl/pace/dsl/caches/cache_location.py rename to ndsl/ndsl/dsl/caches/cache_location.py index 5c1de5f6..b3a4a422 100644 --- a/dsl/pace/dsl/caches/cache_location.py +++ b/ndsl/ndsl/dsl/caches/cache_location.py @@ -1,5 +1,5 @@ -from pace.dsl.caches.codepath import FV3CodePath -from pace.util import Partitioner +from ndsl.dsl.caches.codepath import FV3CodePath +from ndsl.util import Partitioner def identify_code_path( diff --git a/dsl/pace/dsl/caches/codepath.py b/ndsl/ndsl/dsl/caches/codepath.py similarity index 100% rename from dsl/pace/dsl/caches/codepath.py rename to ndsl/ndsl/dsl/caches/codepath.py diff --git a/ndsl/ndsl/dsl/dace/__init__.py b/ndsl/ndsl/dsl/dace/__init__.py new file mode 100644 index 00000000..bcae0c46 --- /dev/null +++ b/ndsl/ndsl/dsl/dace/__init__.py @@ -0,0 +1,2 @@ +from ndsl.dsl.dace.dace_config import DaceConfig +from ndsl.dsl.dace.orchestration import orchestrate diff --git a/dsl/pace/dsl/dace/build.py b/ndsl/ndsl/dsl/dace/build.py similarity index 96% rename from dsl/pace/dsl/dace/build.py rename to ndsl/ndsl/dsl/dace/build.py index 999d9e8e..1849a961 100644 --- a/dsl/pace/dsl/dace/build.py +++ b/ndsl/ndsl/dsl/dace/build.py @@ -2,9 +2,9 @@ from dace.sdfg import SDFG -import pace.util -from pace.dsl.caches.cache_location import get_cache_directory, get_cache_fullpath -from pace.dsl.dace.dace_config import DaceConfig, DaCeOrchestration +import ndsl.util +from ndsl.dsl.caches.cache_location import get_cache_directory, get_cache_fullpath +from ndsl.dsl.dace.dace_config import DaceConfig, DaCeOrchestration ################################################ @@ -135,7 +135,7 @@ def set_distributed_caches(config: "DaceConfig"): verb = "reading" gt_config.cache_settings["dir_name"] = get_cache_directory(config.code_path) - pace.util.pace_log.info( + ndsl.util.pace_log.info( f"[{orchestration_mode}] Rank {config.my_rank} " f"{verb} cache {gt_config.cache_settings['dir_name']}" ) diff --git a/dsl/pace/dsl/dace/dace_config.py b/ndsl/ndsl/dsl/dace/dace_config.py similarity index 97% rename from dsl/pace/dsl/dace/dace_config.py rename to ndsl/ndsl/dsl/dace/dace_config.py index a1906963..f776cdde 100644 --- a/dsl/pace/dsl/dace/dace_config.py +++ b/ndsl/ndsl/dsl/dace/dace_config.py @@ -6,11 +6,11 @@ from dace.codegen.compiled_sdfg import CompiledSDFG from dace.frontend.python.parser import DaceProgram -from pace.dsl.caches.cache_location import identify_code_path -from pace.dsl.caches.codepath import FV3CodePath -from pace.dsl.gt4py_utils import is_gpu_backend -from pace.util._optional_imports import cupy as cp -from pace.util.communicator import Communicator, Partitioner +from ndsl.dsl.caches.cache_location import identify_code_path +from ndsl.dsl.caches.codepath import FV3CodePath +from ndsl.dsl.gt4py_utils import is_gpu_backend +from ndsl.util._optional_imports import cupy as cp +from ndsl.util.communicator import Communicator, Partitioner # This can be turned on to revert compilation for orchestration @@ -271,7 +271,7 @@ def __init__( self._backend = backend self.tile_resolution = [tile_nx, tile_nx, tile_nz] - from pace.dsl.dace.build import set_distributed_caches + from ndsl.dsl.dace.build import set_distributed_caches # Distributed build required info if communicator: diff --git a/dsl/pace/dsl/dace/orchestration.py b/ndsl/ndsl/dsl/dace/orchestration.py similarity index 98% rename from dsl/pace/dsl/dace/orchestration.py rename to ndsl/ndsl/dsl/dace/orchestration.py index 5e5ea52a..a485637a 100644 --- a/dsl/pace/dsl/dace/orchestration.py +++ b/ndsl/ndsl/dsl/dace/orchestration.py @@ -12,26 +12,26 @@ from dace.transformation.helpers import get_parent_map from dace.transformation.passes.simplify import SimplifyPass -from pace.dsl.dace.build import get_sdfg_path, write_build_info -from pace.dsl.dace.dace_config import ( +from ndsl.dsl.dace.build import get_sdfg_path, write_build_info +from ndsl.dsl.dace.dace_config import ( DEACTIVATE_DISTRIBUTED_DACE_COMPILE, DaceConfig, DaCeOrchestration, FrozenCompiledSDFG, ) -from pace.dsl.dace.sdfg_debug_passes import ( +from ndsl.dsl.dace.sdfg_debug_passes import ( negative_delp_checker, negative_qtracers_checker, sdfg_nan_checker, ) -from pace.dsl.dace.sdfg_opt_passes import splittable_region_expansion -from pace.dsl.dace.utils import ( +from ndsl.dsl.dace.sdfg_opt_passes import splittable_region_expansion +from ndsl.dsl.dace.utils import ( DaCeProgress, memory_static_analysis, report_memory_static_analysis, ) -from pace.util import pace_log -from pace.util.mpi import MPI +from ndsl.util import pace_log +from ndsl.util.mpi import MPI try: diff --git a/dsl/pace/dsl/dace/sdfg_debug_passes.py b/ndsl/ndsl/dsl/dace/sdfg_debug_passes.py similarity index 99% rename from dsl/pace/dsl/dace/sdfg_debug_passes.py rename to ndsl/ndsl/dsl/dace/sdfg_debug_passes.py index 40247eb5..a7072568 100644 --- a/dsl/pace/dsl/dace/sdfg_debug_passes.py +++ b/ndsl/ndsl/dsl/dace/sdfg_debug_passes.py @@ -9,7 +9,7 @@ from dace.sdfg import utils as sdutil from dace.transformation.helpers import get_parent_map -from pace.util.logging import pace_log +from ndsl.util.logging import pace_log def _filter_all_maps( diff --git a/dsl/pace/dsl/dace/sdfg_opt_passes.py b/ndsl/ndsl/dsl/dace/sdfg_opt_passes.py similarity index 95% rename from dsl/pace/dsl/dace/sdfg_opt_passes.py rename to ndsl/ndsl/dsl/dace/sdfg_opt_passes.py index 17ec2180..ca206d2d 100644 --- a/dsl/pace/dsl/dace/sdfg_opt_passes.py +++ b/ndsl/ndsl/dsl/dace/sdfg_opt_passes.py @@ -1,6 +1,6 @@ import dace -from pace.util.logging import pace_log +from ndsl.util.logging import pace_log def splittable_region_expansion(sdfg: dace.SDFG, verbose: bool = False): diff --git a/dsl/pace/dsl/dace/utils.py b/ndsl/ndsl/dsl/dace/utils.py similarity index 97% rename from dsl/pace/dsl/dace/utils.py rename to ndsl/ndsl/dsl/dace/utils.py index 28d8abe5..baf91a6e 100644 --- a/dsl/pace/dsl/dace/utils.py +++ b/ndsl/ndsl/dsl/dace/utils.py @@ -8,11 +8,11 @@ from dace.transformation.helpers import get_parent_map from gt4py.cartesian.gtscript import PARALLEL, computation, interval -from pace.dsl.dace.dace_config import DaceConfig -from pace.dsl.stencil import CompilationConfig, FrozenStencil, StencilConfig -from pace.dsl.typing import Float, FloatField -from pace.util._optional_imports import cupy as cp -from pace.util.logging import pace_log +from ndsl.dsl.dace.dace_config import DaceConfig +from ndsl.dsl.stencil import CompilationConfig, FrozenStencil, StencilConfig +from ndsl.dsl.typing import Float, FloatField +from ndsl.util._optional_imports import cupy as cp +from ndsl.util.logging import pace_log # ---------------------------------------------------------- @@ -192,7 +192,7 @@ def copy_defn(q_in: FloatField, q_out: FloatField): class MaxBandwithBenchmarkProgram: def __init__(self, size, backend) -> None: - from pace.dsl.dace.orchestration import DaCeOrchestration, orchestrate + from ndsl.dsl.dace.orchestration import DaCeOrchestration, orchestrate dconfig = DaceConfig(None, backend, orchestration=DaCeOrchestration.BuildAndRun) c = CompilationConfig(backend=backend) diff --git a/dsl/pace/dsl/dace/wrapped_halo_exchange.py b/ndsl/ndsl/dsl/dace/wrapped_halo_exchange.py similarity index 93% rename from dsl/pace/dsl/dace/wrapped_halo_exchange.py rename to ndsl/ndsl/dsl/dace/wrapped_halo_exchange.py index 7d7eed44..51a92f64 100644 --- a/dsl/pace/dsl/dace/wrapped_halo_exchange.py +++ b/ndsl/ndsl/dsl/dace/wrapped_halo_exchange.py @@ -1,9 +1,9 @@ import dataclasses from typing import List, Optional -from pace.dsl.dace.orchestration import dace_inhibitor -from pace.util.communicator import Communicator -from pace.util.halo_updater import HaloUpdater +from ndsl.dsl.dace.orchestration import dace_inhibitor +from ndsl.util.communicator import Communicator +from ndsl.util.halo_updater import HaloUpdater class WrappedHaloUpdater: diff --git a/dsl/pace/dsl/gt4py_utils.py b/ndsl/ndsl/dsl/gt4py_utils.py similarity index 97% rename from dsl/pace/dsl/gt4py_utils.py rename to ndsl/ndsl/dsl/gt4py_utils.py index 7b033fee..4136e87e 100644 --- a/dsl/pace/dsl/gt4py_utils.py +++ b/ndsl/ndsl/dsl/gt4py_utils.py @@ -4,8 +4,9 @@ import gt4py import numpy as np -from pace.dsl.typing import DTypes, Field, Float -from pace.util.logging import pace_log +from ndsl.dsl.typing import DTypes, Field, Float +from ndsl.util.constants import N_HALO_DEFAULT +from ndsl.util.logging import pace_log try: @@ -17,9 +18,12 @@ managed_memory = True # Number of halo lines for each field and default origin -halo = 3 -origin = (halo, halo, 0) +origin = (N_HALO_DEFAULT, N_HALO_DEFAULT, 0) +# TODO: Both pyFV3 and pySHiELD need to know what is being advected +# but the actual value should come from outside of `ndsl`. +# There should be a set of API to deal with tracers, that lives in `ndsl` +# but their call doesn't. # TODO get from field_table tracer_variables = [ "qvapor", diff --git a/dsl/pace/dsl/stencil.py b/ndsl/ndsl/dsl/stencil.py similarity index 96% rename from dsl/pace/dsl/stencil.py rename to ndsl/ndsl/dsl/stencil.py index 29a66e15..e258f60c 100644 --- a/dsl/pace/dsl/stencil.py +++ b/ndsl/ndsl/dsl/stencil.py @@ -22,13 +22,13 @@ from gt4py.cartesian import gtscript from gt4py.cartesian.gtc.passes.oir_pipeline import DefaultPipeline, OirPipeline -import pace.util -from pace.dsl.dace.orchestration import SDFGConvertible -from pace.dsl.stencil_config import CompilationConfig, RunMode, StencilConfig -from pace.dsl.typing import Float, Index3D, cast_to_index3d -from pace.util import testing -from pace.util.decomposition import block_waiting_for_compilation, unblock_waiting_tiles -from pace.util.mpi import MPI +import ndsl.util +from ndsl.dsl.dace.orchestration import SDFGConvertible +from ndsl.dsl.stencil_config import CompilationConfig, RunMode, StencilConfig +from ndsl.dsl.typing import Float, Index3D, cast_to_index3d +from ndsl.util import testing +from ndsl.util.decomposition import block_waiting_for_compilation, unblock_waiting_tiles +from ndsl.util.mpi import MPI try: @@ -41,13 +41,13 @@ def report_difference(args, kwargs, args_copy, kwargs_copy, function_name, gt_id report_head = f"comparing against numpy for func {function_name}, gt_id {gt_id}:" report_segments = [] for i, (arg, numpy_arg) in enumerate(zip(args, args_copy)): - if isinstance(arg, pace.util.Quantity): + if isinstance(arg, ndsl.util.Quantity): arg = arg.data numpy_arg = numpy_arg.data if isinstance(arg, np.ndarray): report_segments.append(report_diff(arg, numpy_arg, label=f"arg {i}")) for name in kwargs: - if isinstance(kwargs[name], pace.util.Quantity): + if isinstance(kwargs[name], ndsl.util.Quantity): kwarg = kwargs[name].data numpy_kwarg = kwargs_copy[name].data else: @@ -178,7 +178,7 @@ def __init__( externals: Optional[Mapping[str, Any]] = None, skip_passes: Optional[Tuple[str, ...]] = None, timing_collector: Optional[TimingCollector] = None, - comm: Optional[pace.util.Comm] = None, + comm: Optional[ndsl.util.Comm] = None, ): self._actual = FrozenStencil( func=func, @@ -247,13 +247,13 @@ def get_pair_rank(rank: int, size: int): return rank - dycore_ranks -def compare_ranks(comm: pace.util.Comm, data) -> Mapping[str, int]: +def compare_ranks(comm: ndsl.util.Comm, data) -> Mapping[str, int]: rank = comm.Get_rank() size = comm.Get_size() pair_rank = get_pair_rank(rank, size) differences = {} for name, maybe_array in sorted(data.items(), key=lambda x: x[0]): - if isinstance(maybe_array, pace.util.Quantity): + if isinstance(maybe_array, ndsl.util.Quantity): maybe_array = maybe_array.data if hasattr(maybe_array, "data") and isinstance(maybe_array.data, np.ndarray): array = maybe_array.data @@ -284,7 +284,7 @@ def __init__( externals: Optional[Mapping[str, Any]] = None, skip_passes: Tuple[str, ...] = (), timing_collector: Optional[TimingCollector] = None, - comm: Optional[pace.util.Comm] = None, + comm: Optional[ndsl.util.Comm] = None, ): """ Args: @@ -525,7 +525,7 @@ def _convert_quantities_to_storage(args, kwargs): for i, arg in enumerate(args): try: # Check that 'dims' is an attribute of arg. If so, - # this means it's a pace.util.Quantity, so we need + # this means it's a ndsl.util.Quantity, so we need # to pull off the ndarray. arg.dims args[i] = arg.data @@ -534,7 +534,7 @@ def _convert_quantities_to_storage(args, kwargs): for name, arg in kwargs.items(): try: # Check that 'dims' is an attribute of arg. If so, - # this means it's a pace.util.Quantity, so we need + # this means it's a ndsl.util.Quantity, so we need # to pull off the ndarray. arg.dims kwargs[name] = arg.data @@ -585,7 +585,7 @@ def domain(self): @domain.setter def domain(self, domain): self._domain = domain - self._sizer = pace.util.SubtileGridSizer( + self._sizer = ndsl.util.SubtileGridSizer( nx=domain[0], ny=domain[1], nz=domain[2], @@ -595,13 +595,13 @@ def domain(self, domain): @classmethod def from_sizer_and_communicator( - cls, sizer: pace.util.GridSizer, comm: pace.util.Communicator + cls, sizer: ndsl.util.GridSizer, comm: ndsl.util.Communicator ) -> "GridIndexing": # TODO: if this class is refactored to split off the *_edge booleans, # this init routine can be refactored to require only a GridSizer domain = cast( Tuple[int, int, int], - sizer.get_extent([pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM]), + sizer.get_extent([ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM]), ) south_edge = comm.tile.partitioner.on_tile_bottom(comm.rank) north_edge = comm.tile.partitioner.on_tile_top(comm.rank) @@ -769,7 +769,7 @@ def get_origin_domain( configuration (given by dims) and a certain number of halo points. Args: - dims: dimension names, using dimension constants from pace.util + dims: dimension names, using dimension constants from ndsl.util halos: number of halo points for each dimension, defaults to zero Returns: @@ -786,11 +786,11 @@ def get_origin_domain( def _origin_from_dims(self, dims: Iterable[str]) -> List[int]: return_origin = [] for dim in dims: - if dim in pace.util.X_DIMS: + if dim in ndsl.util.X_DIMS: return_origin.append(self.origin[0]) - elif dim in pace.util.Y_DIMS: + elif dim in ndsl.util.Y_DIMS: return_origin.append(self.origin[1]) - elif dim in pace.util.Z_DIMS: + elif dim in ndsl.util.Z_DIMS: return_origin.append(self.origin[2]) return return_origin @@ -802,7 +802,7 @@ def get_shape( which is accessed up to a given number of halo points. Args: - dims: dimension names, using dimension constants from pace.util + dims: dimension names, using dimension constants from ndsl.util halos: number of halo points for each dimension, defaults to zero Returns: @@ -813,7 +813,7 @@ def get_shape( for i, d in enumerate(dims): # need n_halo points at the start of the domain, regardless of whether # they are read, so that data is aligned in memory - if d in (pace.util.X_DIMS + pace.util.Y_DIMS): + if d in (ndsl.util.X_DIMS + ndsl.util.Y_DIMS): shape[i] += self.n_halo for i, n in enumerate(halos): shape[i] += n @@ -865,7 +865,7 @@ def __init__( self, config: StencilConfig, grid_indexing: GridIndexing, - comm: Optional[pace.util.Comm] = None, + comm: Optional[ndsl.util.Comm] = None, ): """ Args: diff --git a/dsl/pace/dsl/stencil_config.py b/ndsl/ndsl/dsl/stencil_config.py similarity index 97% rename from dsl/pace/dsl/stencil_config.py rename to ndsl/ndsl/dsl/stencil_config.py index 79eff931..e8b74ef5 100644 --- a/dsl/pace/dsl/stencil_config.py +++ b/ndsl/ndsl/dsl/stencil_config.py @@ -5,11 +5,11 @@ from gt4py.cartesian.gtc.passes.oir_pipeline import DefaultPipeline, OirPipeline -from pace.dsl.dace.dace_config import DaceConfig, DaCeOrchestration -from pace.dsl.gt4py_utils import is_gpu_backend -from pace.util.communicator import Communicator -from pace.util.decomposition import determine_rank_is_compiling, set_distributed_caches -from pace.util.partitioner import Partitioner +from ndsl.dsl.dace.dace_config import DaceConfig, DaCeOrchestration +from ndsl.dsl.gt4py_utils import is_gpu_backend +from ndsl.util.communicator import Communicator +from ndsl.util.decomposition import determine_rank_is_compiling, set_distributed_caches +from ndsl.util.partitioner import Partitioner class RunMode(enum.Enum): diff --git a/dsl/pace/dsl/typing.py b/ndsl/ndsl/dsl/typing.py similarity index 100% rename from dsl/pace/dsl/typing.py rename to ndsl/ndsl/dsl/typing.py diff --git a/stencils/pace/stencils/__init__.py b/ndsl/ndsl/stencils/__init__.py similarity index 100% rename from stencils/pace/stencils/__init__.py rename to ndsl/ndsl/stencils/__init__.py diff --git a/stencils/pace/stencils/c2l_ord.py b/ndsl/ndsl/stencils/c2l_ord.py similarity index 94% rename from stencils/pace/stencils/c2l_ord.py rename to ndsl/ndsl/stencils/c2l_ord.py index e4610b69..a9c8ef73 100644 --- a/stencils/pace/stencils/c2l_ord.py +++ b/ndsl/ndsl/stencils/c2l_ord.py @@ -7,14 +7,14 @@ region, ) -import pace.dsl.gt4py_utils as utils -import pace.util +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +from ndsl.dsl.dace.wrapped_halo_exchange import WrappedHaloUpdater +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.util.constants import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM +from ndsl.util.grid import GridData from pace import fv3core -from pace.dsl.dace.wrapped_halo_exchange import WrappedHaloUpdater -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ -from pace.util.constants import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_DIM -from pace.util.grid import GridData A1 = 0.5625 @@ -158,11 +158,11 @@ def __init__( self, state: fv3core.DycoreState, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, grid_data: GridData, grid_type: int, order: int, - comm: pace.util.Communicator, + comm: ndsl.util.Communicator, ): """ Initializes stencils to use either 2nd or 4th order of interpolation diff --git a/stencils/pace/stencils/corners.py b/ndsl/ndsl/stencils/corners.py similarity index 99% rename from stencils/pace/stencils/corners.py rename to ndsl/ndsl/stencils/corners.py index a521bf2b..6e39106a 100644 --- a/stencils/pace/stencils/corners.py +++ b/ndsl/ndsl/stencils/corners.py @@ -3,9 +3,9 @@ from gt4py.cartesian import gtscript from gt4py.cartesian.gtscript import PARALLEL, computation, horizontal, interval, region -from pace.dsl.stencil import GridIndexing, StencilFactory -from pace.dsl.typing import FloatField -from pace.util.constants import ( +from ndsl.dsl.stencil import GridIndexing, StencilFactory +from ndsl.dsl.typing import FloatField +from ndsl.util.constants import ( X_DIM, X_INTERFACE_DIM, Y_DIM, @@ -555,7 +555,6 @@ def __init__( origin=None, domain=None, ) -> None: - n_halo = stencil_factory.grid_indexing.n_halo ( default_origin, @@ -716,6 +715,7 @@ def fill_corners_bgrid_y_defn(q_in: FloatField, q_out: FloatField): # TODO these fill corner 2d, agrid, bgrid routines need to be tested and integrated; # they've just been copied from an older version of the code + # TODO these can definitely be consolidated/made simpler def fill_sw_corner_2d_bgrid(q, i, j, direction, grid_indexer): if direction == "x": diff --git a/stencils/pace/stencils/testing/README.md b/ndsl/ndsl/stencils/testing/README.md similarity index 100% rename from stencils/pace/stencils/testing/README.md rename to ndsl/ndsl/stencils/testing/README.md diff --git a/stencils/pace/stencils/testing/__init__.py b/ndsl/ndsl/stencils/testing/__init__.py similarity index 100% rename from stencils/pace/stencils/testing/__init__.py rename to ndsl/ndsl/stencils/testing/__init__.py diff --git a/stencils/pace/stencils/testing/conftest.py b/ndsl/ndsl/stencils/testing/conftest.py similarity index 91% rename from stencils/pace/stencils/testing/conftest.py rename to ndsl/ndsl/stencils/testing/conftest.py index 1b93f06c..2cb02349 100644 --- a/stencils/pace/stencils/testing/conftest.py +++ b/ndsl/ndsl/stencils/testing/conftest.py @@ -7,12 +7,12 @@ import xarray as xr import yaml -import pace.dsl -import pace.util -from pace.dsl.dace.dace_config import DaceConfig -from pace.stencils.testing import ParallelTranslate, TranslateGrid -from pace.stencils.testing.savepoint import SavepointCase, dataset_to_dict -from pace.util.mpi import MPI +import ndsl.dsl +import ndsl.util +from ndsl.dsl.dace.dace_config import DaceConfig +from ndsl.stencils.testing import ParallelTranslate, TranslateGrid +from ndsl.stencils.testing.savepoint import SavepointCase, dataset_to_dict +from ndsl.util.mpi import MPI @pytest.fixture() @@ -114,12 +114,12 @@ def get_ranks(metafunc, layout): def get_namelist(namelist_filename): - return pace.util.Namelist.from_f90nml(f90nml.read(namelist_filename)) + return ndsl.util.Namelist.from_f90nml(f90nml.read(namelist_filename)) -def get_config(backend: str, communicator: Optional[pace.util.Communicator]): - stencil_config = pace.dsl.stencil.StencilConfig( - compilation_config=pace.dsl.stencil.CompilationConfig( +def get_config(backend: str, communicator: Optional[ndsl.util.Communicator]): + stencil_config = ndsl.dsl.stencil.StencilConfig( + compilation_config=ndsl.dsl.stencil.CompilationConfig( backend=backend, rebuild=False, validate_args=True ), dace_config=DaceConfig( @@ -172,7 +172,7 @@ def _savepoint_cases( ).python_grid() if compute_grid: compute_grid_data(grid, namelist, backend, namelist.layout, dperiodic) - stencil_factory = pace.dsl.stencil.StencilFactory( + stencil_factory = ndsl.dsl.stencil.StencilFactory( config=stencil_config, grid_indexing=grid.grid_indexing, ) @@ -271,13 +271,13 @@ def generate_parallel_stencil_tests(metafunc, *, backend: str): def get_communicator(comm, layout, dperiodic): if (MPI.COMM_WORLD.Get_size() > 1) and (not dperiodic): - partitioner = pace.util.CubedSpherePartitioner( - pace.util.TilePartitioner(layout) + partitioner = ndsl.util.CubedSpherePartitioner( + ndsl.util.TilePartitioner(layout) ) - communicator = pace.util.CubedSphereCommunicator(comm, partitioner) + communicator = ndsl.util.CubedSphereCommunicator(comm, partitioner) else: - partitioner = pace.util.TilePartitioner(layout) - communicator = pace.util.TileCommunicator(comm, partitioner) + partitioner = ndsl.util.TilePartitioner(layout) + communicator = ndsl.util.TileCommunicator(comm, partitioner) return communicator diff --git a/stencils/pace/stencils/testing/grid.py b/ndsl/ndsl/stencils/testing/grid.py similarity index 95% rename from stencils/pace/stencils/testing/grid.py rename to ndsl/ndsl/stencils/testing/grid.py index 23d25882..e6e2386c 100644 --- a/stencils/pace/stencils/testing/grid.py +++ b/ndsl/ndsl/stencils/testing/grid.py @@ -3,11 +3,11 @@ import numpy as np -import pace.util -from pace.dsl import gt4py_utils as utils -from pace.dsl.stencil import GridIndexing -from pace.dsl.typing import Float -from pace.util.grid import ( +import ndsl.util +from ndsl.dsl import gt4py_utils as utils +from ndsl.dsl.stencil import GridIndexing +from ndsl.dsl.typing import Float +from ndsl.util.grid import ( AngleGridData, ContravariantGridData, DampingCoefficients, @@ -18,7 +18,7 @@ MetricTerms, VerticalGridData, ) -from pace.util.halo_data_transformer import QuantityHaloSpec +from ndsl.util.halo_data_transformer import QuantityHaloSpec TRACER_DIM = "tracers" @@ -47,13 +47,13 @@ def _make(cls, npx, npy, npz, layout, rank, backend): ny = int((npy - 1) / layout[1]) indices = { "isd": 0, - "ied": nx + 2 * utils.halo - 1, - "is_": utils.halo, - "ie": nx + utils.halo - 1, + "ied": nx + 2 * ndsl.util.N_HALO_DEFAULT - 1, + "is_": ndsl.util.N_HALO_DEFAULT, + "ie": nx + ndsl.util.N_HALO_DEFAULT - 1, "jsd": 0, - "jed": ny + 2 * utils.halo - 1, - "js": utils.halo, - "je": ny + utils.halo - 1, + "jed": ny + 2 * ndsl.util.N_HALO_DEFAULT - 1, + "js": ndsl.util.N_HALO_DEFAULT, + "je": ny + ndsl.util.N_HALO_DEFAULT - 1, } return cls(indices, shape_params, rank, layout, backend, local_indices=True) @@ -87,7 +87,7 @@ def __init__( ): self.rank = rank self.backend = backend - self.partitioner = pace.util.TilePartitioner(layout) + self.partitioner = ndsl.util.TilePartitioner(layout) self.subtile_index = self.partitioner.subtile_index(self.rank) self.layout = layout for s in self.shape_params: @@ -104,7 +104,7 @@ def __init__( self.njd = int(self.jed - self.jsd + 1) self.nic = int(self.ie - self.is_ + 1) self.njc = int(self.je - self.js + 1) - self.halo = utils.halo + self.halo = ndsl.util.N_HALO_DEFAULT self.global_is, self.global_js = self.local_to_global_indices(self.is_, self.js) self.global_ie, self.global_je = self.local_to_global_indices(self.ie, self.je) self.global_isd, self.global_jsd = self.local_to_global_indices( @@ -137,7 +137,7 @@ def sizer(self): if self._sizer is None: # in the future this should use from_namelist, when we have a non-flattened # namelist - self._sizer = pace.util.SubtileGridSizer.from_tile_params( + self._sizer = ndsl.util.SubtileGridSizer.from_tile_params( nx_tile=self.npx - 1, ny_tile=self.npy - 1, nz=self.npz, @@ -153,9 +153,9 @@ def sizer(self): return self._sizer @property - def quantity_factory(self) -> pace.util.QuantityFactory: + def quantity_factory(self) -> ndsl.util.QuantityFactory: if self._quantity_factory is None: - self._quantity_factory = pace.util.QuantityFactory.from_backend( + self._quantity_factory = ndsl.util.QuantityFactory.from_backend( self.sizer, backend=self.backend ) return self._quantity_factory @@ -163,7 +163,7 @@ def quantity_factory(self) -> pace.util.QuantityFactory: def make_quantity( self, array, - dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], units="Unknown", origin=None, extent=None, @@ -172,7 +172,7 @@ def make_quantity( origin = self.compute_origin() if extent is None: extent = self.domain_shape_compute() - return pace.util.Quantity( + return ndsl.util.Quantity( array, dims=dims, units=units, origin=origin, extent=extent ) @@ -180,7 +180,7 @@ def quantity_dict_update( self, data_dict, varname, - dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], units="Unknown", ): data_dict[varname + "_quantity"] = self.quantity_wrap( @@ -190,12 +190,12 @@ def quantity_dict_update( def quantity_wrap( self, data, - dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], units="unknown", ): origin = self.sizer.get_origin(dims) extent = self.sizer.get_extent(dims) - return pace.util.Quantity( + return ndsl.util.Quantity( data, dims=dims, units=units, origin=origin, extent=extent ) @@ -441,7 +441,7 @@ def get_halo_update_spec( shape, origin, halo_points, - dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], ) -> QuantityHaloSpec: """Build memory specifications for the halo update.""" return self.quantity_factory.get_quantity_halo_spec( @@ -485,7 +485,7 @@ def grid_data(self) -> "GridData": # The translate code pads ndarray axes with zeros in certain cases, # in particular the vertical axis. Since we're deprecating those tests, # we simply "fix" those arrays here. - clipped_data: Dict[str, pace.util.Quantity] = {} + clipped_data: Dict[str, ndsl.util.Quantity] = {} for name in ( "ee1", "ee2", diff --git a/stencils/pace/stencils/testing/parallel_translate.py b/ndsl/ndsl/stencils/testing/parallel_translate.py similarity index 97% rename from stencils/pace/stencils/testing/parallel_translate.py rename to ndsl/ndsl/stencils/testing/parallel_translate.py index f10b9b27..f283ec73 100644 --- a/stencils/pace/stencils/testing/parallel_translate.py +++ b/ndsl/ndsl/stencils/testing/parallel_translate.py @@ -5,8 +5,8 @@ import numpy as np import pytest -import pace.util as fv3util -from pace.dsl import gt4py_utils as utils +import ndsl.util as fv3util +from ndsl.dsl import gt4py_utils as utils from .translate import TranslateFortranData2Py, read_serialized_data @@ -107,7 +107,8 @@ def outputs_from_state(self, state: dict): state[standard_name] = state[standard_name].transpose(dims) if len(properties["dims"]) > 0: output_slice = _serialize_slice( - state[standard_name], properties.get("n_halo", utils.halo) + state[standard_name], + properties.get("n_halo", fv3util.N_HALO_DEFAULT), ) return_dict[name] = utils.asarray( state[standard_name].data[output_slice] @@ -195,7 +196,8 @@ def state_from_inputs(self, inputs: dict, grid=None) -> dict: properties["dims"], properties["units"], dtype=inputs[name].dtype ) input_slice = _serialize_slice( - state[standard_name], properties.get("n_halo", utils.halo) + state[standard_name], + properties.get("n_halo", fv3util.N_HALO_DEFAULT), ) if len(properties["dims"]) > 0: state[standard_name].data[input_slice] = utils.asarray( diff --git a/stencils/pace/stencils/testing/savepoint.py b/ndsl/ndsl/stencils/testing/savepoint.py similarity index 100% rename from stencils/pace/stencils/testing/savepoint.py rename to ndsl/ndsl/stencils/testing/savepoint.py diff --git a/stencils/pace/stencils/testing/temporaries.py b/ndsl/ndsl/stencils/testing/temporaries.py similarity index 95% rename from stencils/pace/stencils/testing/temporaries.py rename to ndsl/ndsl/stencils/testing/temporaries.py index 2dd46663..229ffa48 100644 --- a/stencils/pace/stencils/testing/temporaries.py +++ b/ndsl/ndsl/stencils/testing/temporaries.py @@ -3,7 +3,7 @@ import numpy as np -import pace.util +import ndsl.util def copy_temporaries(obj, max_depth: int) -> dict: @@ -14,7 +14,7 @@ def copy_temporaries(obj, max_depth: int) -> dict: attr = getattr(obj, attr_name) except AttributeError: attr = None - if isinstance(attr, pace.util.Quantity): + if isinstance(attr, ndsl.util.Quantity): temporaries[attr_name] = copy.deepcopy(np.asarray(attr.data)) elif attr.__class__.__module__.split(".")[0] in ( # type: ignore "fv3core", diff --git a/stencils/pace/stencils/testing/test_translate.py b/ndsl/ndsl/stencils/testing/test_translate.py similarity index 95% rename from stencils/pace/stencils/testing/test_translate.py rename to ndsl/ndsl/stencils/testing/test_translate.py index 796f30c1..b5976767 100644 --- a/stencils/pace/stencils/testing/test_translate.py +++ b/ndsl/ndsl/stencils/testing/test_translate.py @@ -6,14 +6,14 @@ import numpy as np import pytest -import pace.dsl -import pace.dsl.gt4py_utils as gt_utils -import pace.util -from pace.dsl.dace.dace_config import DaceConfig -from pace.dsl.stencil import CompilationConfig -from pace.stencils.testing import SavepointCase, dataset_to_dict -from pace.util.mpi import MPI -from pace.util.testing import compare_scalar, perturb, success, success_array +import ndsl.dsl +import ndsl.dsl.gt4py_utils as gt_utils +import ndsl.util +from ndsl.dsl.dace.dace_config import DaceConfig +from ndsl.dsl.stencil import CompilationConfig +from ndsl.stencils.testing import SavepointCase, dataset_to_dict +from ndsl.util.mpi import MPI +from ndsl.util.testing import compare_scalar, perturb, success, success_array # this only matters for manually-added print statements @@ -232,7 +232,7 @@ def test_sequential_savepoint( pytest.xfail( f"no translate object available for savepoint {case.savepoint_name}" ) - stencil_config = pace.dsl.StencilConfig( + stencil_config = ndsl.dsl.StencilConfig( compilation_config=CompilationConfig(backend=backend), dace_config=DaceConfig( communicator=None, @@ -309,13 +309,13 @@ def test_sequential_savepoint( def state_from_savepoint(serializer, savepoint, name_to_std_name): - properties = pace.util.fortran_info.properties_by_std_name + properties = ndsl.util.fortran_info.properties_by_std_name origin = gt_utils.origin state = {} for name, std_name in name_to_std_name.items(): array = serializer.read(name, savepoint) extent = tuple(np.asarray(array.shape) - 2 * np.asarray(origin)) - state["air_temperature"] = pace.util.Quantity( + state["air_temperature"] = ndsl.util.Quantity( array, dims=reversed(properties["air_temperature"]["dims"]), units=properties["air_temperature"]["units"], @@ -326,14 +326,14 @@ def state_from_savepoint(serializer, savepoint, name_to_std_name): def get_communicator(comm, layout): - partitioner = pace.util.CubedSpherePartitioner(pace.util.TilePartitioner(layout)) - communicator = pace.util.CubedSphereCommunicator(comm, partitioner) + partitioner = ndsl.util.CubedSpherePartitioner(ndsl.util.TilePartitioner(layout)) + communicator = ndsl.util.CubedSphereCommunicator(comm, partitioner) return communicator def get_tile_communicator(comm, layout): - partitioner = pace.util.TilePartitioner(layout) - communicator = pace.util.TileCommunicator(comm, partitioner) + partitioner = ndsl.util.TilePartitioner(layout) + communicator = ndsl.util.TileCommunicator(comm, partitioner) return communicator @@ -369,7 +369,7 @@ def test_parallel_savepoint( pytest.xfail( f"no translate object available for savepoint {case.savepoint_name}" ) - stencil_config = pace.dsl.StencilConfig( + stencil_config = ndsl.dsl.StencilConfig( compilation_config=CompilationConfig(backend=backend), dace_config=DaceConfig( communicator=communicator, diff --git a/stencils/pace/stencils/testing/translate.py b/ndsl/ndsl/stencils/testing/translate.py similarity index 97% rename from stencils/pace/stencils/testing/translate.py rename to ndsl/ndsl/stencils/testing/translate.py index ac807813..674a0f58 100644 --- a/stencils/pace/stencils/testing/translate.py +++ b/ndsl/ndsl/stencils/testing/translate.py @@ -3,11 +3,11 @@ import numpy as np -import pace.dsl.gt4py_utils as utils -import pace.util -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Field # noqa: F401 -from pace.stencils.testing.grid import Grid # type: ignore +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Field # noqa: F401 +from ndsl.stencils.testing.grid import Grid # type: ignore try: @@ -32,10 +32,10 @@ def pad_field_in_j(field, nj: int, backend: str): def as_numpy( - value: Union[Dict[str, Any], pace.util.Quantity, np.ndarray] + value: Union[Dict[str, Any], ndsl.util.Quantity, np.ndarray] ) -> Union[np.ndarray, Dict[str, np.ndarray]]: - def _convert(value: Union[pace.util.Quantity, np.ndarray]) -> np.ndarray: - if isinstance(value, pace.util.Quantity): + def _convert(value: Union[ndsl.util.Quantity, np.ndarray]) -> np.ndarray: + if isinstance(value, ndsl.util.Quantity): return value.data elif cp is not None and isinstance(value, cp.ndarray): return cp.asnumpy(value) @@ -313,7 +313,6 @@ def __init__(self, inputs, rank, layout, *, backend: str): self.data = inputs def _make_composite_var_storage(self, varname, data3d, shape, count): - for s in range(count): self.data[varname + str(s + 1)] = utils.make_storage_data( np.squeeze(data3d[:, :, s]), diff --git a/util/pace/util/__init__.py b/ndsl/ndsl/util/__init__.py similarity index 100% rename from util/pace/util/__init__.py rename to ndsl/ndsl/util/__init__.py diff --git a/util/pace/util/_boundary_utils.py b/ndsl/ndsl/util/_boundary_utils.py similarity index 100% rename from util/pace/util/_boundary_utils.py rename to ndsl/ndsl/util/_boundary_utils.py diff --git a/util/pace/util/_capture_stream.py b/ndsl/ndsl/util/_capture_stream.py similarity index 100% rename from util/pace/util/_capture_stream.py rename to ndsl/ndsl/util/_capture_stream.py diff --git a/util/pace/util/_corners.py b/ndsl/ndsl/util/_corners.py similarity index 100% rename from util/pace/util/_corners.py rename to ndsl/ndsl/util/_corners.py diff --git a/util/pace/util/_exceptions.py b/ndsl/ndsl/util/_exceptions.py similarity index 100% rename from util/pace/util/_exceptions.py rename to ndsl/ndsl/util/_exceptions.py diff --git a/util/pace/util/_legacy_restart.py b/ndsl/ndsl/util/_legacy_restart.py similarity index 100% rename from util/pace/util/_legacy_restart.py rename to ndsl/ndsl/util/_legacy_restart.py diff --git a/util/pace/util/_optional_imports.py b/ndsl/ndsl/util/_optional_imports.py similarity index 100% rename from util/pace/util/_optional_imports.py rename to ndsl/ndsl/util/_optional_imports.py diff --git a/util/pace/util/_profiler.py b/ndsl/ndsl/util/_profiler.py similarity index 100% rename from util/pace/util/_profiler.py rename to ndsl/ndsl/util/_profiler.py diff --git a/util/pace/util/_properties.py b/ndsl/ndsl/util/_properties.py similarity index 100% rename from util/pace/util/_properties.py rename to ndsl/ndsl/util/_properties.py diff --git a/util/pace/util/_timing.py b/ndsl/ndsl/util/_timing.py similarity index 99% rename from util/pace/util/_timing.py rename to ndsl/ndsl/util/_timing.py index d4d08f7f..97b96f07 100644 --- a/util/pace/util/_timing.py +++ b/ndsl/ndsl/util/_timing.py @@ -57,7 +57,7 @@ def clock(self, name: str): following would time a time.sleep operation:: >>> import time - >>> from pace.util import Timer + >>> from ndsl.util import Timer >>> timer = Timer() >>> with timer.clock("sleep"): ... time.sleep(1) @@ -65,6 +65,7 @@ def clock(self, name: str): >>> timer.times {'sleep': 1.0032463260000029} """ + # [DaCe] Because the contextlib is a "one-shot" object # which self-destroys itself when called, we can't orchestrate # it easily in DaCe. Waiting for a fix DaCe side to this Python diff --git a/util/pace/util/_xarray.py b/ndsl/ndsl/util/_xarray.py similarity index 100% rename from util/pace/util/_xarray.py rename to ndsl/ndsl/util/_xarray.py diff --git a/util/pace/util/boundary.py b/ndsl/ndsl/util/boundary.py similarity index 100% rename from util/pace/util/boundary.py rename to ndsl/ndsl/util/boundary.py diff --git a/util/pace/util/buffer.py b/ndsl/ndsl/util/buffer.py similarity index 100% rename from util/pace/util/buffer.py rename to ndsl/ndsl/util/buffer.py diff --git a/util/pace/util/caching_comm.py b/ndsl/ndsl/util/caching_comm.py similarity index 100% rename from util/pace/util/caching_comm.py rename to ndsl/ndsl/util/caching_comm.py diff --git a/util/pace/util/checkpointer/__init__.py b/ndsl/ndsl/util/checkpointer/__init__.py similarity index 100% rename from util/pace/util/checkpointer/__init__.py rename to ndsl/ndsl/util/checkpointer/__init__.py diff --git a/util/pace/util/checkpointer/base.py b/ndsl/ndsl/util/checkpointer/base.py similarity index 100% rename from util/pace/util/checkpointer/base.py rename to ndsl/ndsl/util/checkpointer/base.py diff --git a/util/pace/util/checkpointer/null.py b/ndsl/ndsl/util/checkpointer/null.py similarity index 100% rename from util/pace/util/checkpointer/null.py rename to ndsl/ndsl/util/checkpointer/null.py diff --git a/util/pace/util/checkpointer/snapshots.py b/ndsl/ndsl/util/checkpointer/snapshots.py similarity index 95% rename from util/pace/util/checkpointer/snapshots.py rename to ndsl/ndsl/util/checkpointer/snapshots.py index 97912f6e..7498a66a 100644 --- a/util/pace/util/checkpointer/snapshots.py +++ b/ndsl/ndsl/util/checkpointer/snapshots.py @@ -2,8 +2,8 @@ import numpy as np -from pace.util._optional_imports import cupy as cp -from pace.util._optional_imports import xarray as xr +from ndsl.util._optional_imports import cupy as cp +from ndsl.util._optional_imports import xarray as xr from .base import Checkpointer diff --git a/util/pace/util/checkpointer/thresholds.py b/ndsl/ndsl/util/checkpointer/thresholds.py similarity index 100% rename from util/pace/util/checkpointer/thresholds.py rename to ndsl/ndsl/util/checkpointer/thresholds.py diff --git a/util/pace/util/checkpointer/validation.py b/ndsl/ndsl/util/checkpointer/validation.py similarity index 98% rename from util/pace/util/checkpointer/validation.py rename to ndsl/ndsl/util/checkpointer/validation.py index 2a50f5b6..85f6701a 100644 --- a/util/pace/util/checkpointer/validation.py +++ b/ndsl/ndsl/util/checkpointer/validation.py @@ -5,7 +5,7 @@ import numpy as np -from pace.util._optional_imports import xarray as xr +from ndsl.util._optional_imports import xarray as xr from .base import Checkpointer from .thresholds import ArrayLike, SavepointName, SavepointThresholds, cast_to_ndarray diff --git a/util/pace/util/comm.py b/ndsl/ndsl/util/comm.py similarity index 100% rename from util/pace/util/comm.py rename to ndsl/ndsl/util/comm.py diff --git a/util/pace/util/communicator.py b/ndsl/ndsl/util/communicator.py similarity index 100% rename from util/pace/util/communicator.py rename to ndsl/ndsl/util/communicator.py diff --git a/util/pace/util/constants.py b/ndsl/ndsl/util/constants.py similarity index 99% rename from util/pace/util/constants.py rename to ndsl/ndsl/util/constants.py index a470581d..40ab8a49 100644 --- a/util/pace/util/constants.py +++ b/ndsl/ndsl/util/constants.py @@ -1,7 +1,7 @@ import os from enum import Enum -from pace.util.logging import pace_log +from ndsl.util.logging import pace_log # The FV3GFS model ships with two sets of constants, one used in the GFS physics diff --git a/util/pace/util/cuda_kernels.py b/ndsl/ndsl/util/cuda_kernels.py similarity index 100% rename from util/pace/util/cuda_kernels.py rename to ndsl/ndsl/util/cuda_kernels.py diff --git a/util/pace/util/decomposition.py b/ndsl/ndsl/util/decomposition.py similarity index 96% rename from util/pace/util/decomposition.py rename to ndsl/ndsl/util/decomposition.py index f2e2bc41..48c216e8 100644 --- a/util/pace/util/decomposition.py +++ b/ndsl/ndsl/util/decomposition.py @@ -7,7 +7,7 @@ if TYPE_CHECKING: - from pace.dsl.stencil_config import CompilationConfig + from ndsl.dsl.stencil_config import CompilationConfig def determine_rank_is_compiling(rank: int, size: int) -> bool: @@ -81,7 +81,7 @@ def set_distributed_caches(config: CompilationConfig): # Check that we have all the file we need to early out in case # of issues. - from pace.dsl.stencil_config import RunMode + from ndsl.dsl.stencil_config import RunMode if config.run_mode == RunMode.Run: cache_filepath, target_rank_str = build_cache_path(config) diff --git a/util/pace/util/filesystem.py b/ndsl/ndsl/util/filesystem.py similarity index 100% rename from util/pace/util/filesystem.py rename to ndsl/ndsl/util/filesystem.py diff --git a/util/pace/util/global_config.py b/ndsl/ndsl/util/global_config.py similarity index 100% rename from util/pace/util/global_config.py rename to ndsl/ndsl/util/global_config.py diff --git a/util/pace/util/grid/__init__.py b/ndsl/ndsl/util/grid/__init__.py similarity index 100% rename from util/pace/util/grid/__init__.py rename to ndsl/ndsl/util/grid/__init__.py diff --git a/util/pace/util/grid/eta.py b/ndsl/ndsl/util/grid/eta.py similarity index 100% rename from util/pace/util/grid/eta.py rename to ndsl/ndsl/util/grid/eta.py diff --git a/util/pace/util/grid/generation.py b/ndsl/ndsl/util/grid/generation.py similarity index 99% rename from util/pace/util/grid/generation.py rename to ndsl/ndsl/util/grid/generation.py index 2c556576..4f676b45 100644 --- a/util/pace/util/grid/generation.py +++ b/ndsl/ndsl/util/grid/generation.py @@ -5,19 +5,19 @@ import numpy as np -from pace import util -from pace.dsl.gt4py_utils import asarray -from pace.dsl.stencil import GridIndexing -from pace.dsl.typing import Float -from pace.stencils.corners import ( +from ndsl import util +from ndsl.dsl.gt4py_utils import asarray +from ndsl.dsl.stencil import GridIndexing +from ndsl.dsl.typing import Float +from ndsl.stencils.corners import ( fill_corners_2d, fill_corners_agrid, fill_corners_cgrid, fill_corners_dgrid, ) -from pace.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_INTERFACE_DIM -from pace.util.constants import N_HALO_DEFAULT, PI, RADIUS -from pace.util.grid import eta +from ndsl.util import X_DIM, X_INTERFACE_DIM, Y_DIM, Y_INTERFACE_DIM, Z_INTERFACE_DIM +from ndsl.util.constants import N_HALO_DEFAULT, PI, RADIUS +from ndsl.util.grid import eta from .geometry import ( calc_unit_vector_south, @@ -1605,7 +1605,6 @@ def rdyc(self) -> util.Quantity: ) def _init_cartesian(self): - domain_rad = PI / 16.0 lat_rad = self._deglat * PI / 180.0 lon_rad = 0.0 @@ -2621,7 +2620,6 @@ def _init_cell_trigonometry_cube_sphere(self): self._sina = quantity_cast_to_model_float(self.quantity_factory, sina_64) def _init_cell_trigonometry_cartesian(self): - cosa_u_64 = self.quantity_factory.zeros( [util.X_INTERFACE_DIM, util.Y_DIM], "", diff --git a/util/pace/util/grid/geometry.py b/ndsl/ndsl/util/grid/geometry.py similarity index 99% rename from util/pace/util/grid/geometry.py rename to ndsl/ndsl/util/grid/geometry.py index 5ae7ee53..e498e4db 100644 --- a/util/pace/util/grid/geometry.py +++ b/ndsl/ndsl/util/grid/geometry.py @@ -1,4 +1,4 @@ -from pace.util import Quantity, TilePartitioner +from ndsl.util import Quantity, TilePartitioner from .gnomonic import ( get_lonlat_vect, @@ -80,7 +80,6 @@ def calc_unit_vector_west( ew1 = np.zeros((xyz_dgrid.shape[0], xyz_agrid.shape[1], 3)) ew2 = np.zeros((xyz_dgrid.shape[0], xyz_agrid.shape[1], 3)) if grid_type < 3: - pp = xyz_midpoint(xyz_dgrid[1:-1, :-1, :3], xyz_dgrid[1:-1, 1:, :3]) p2 = np.cross(xyz_agrid[:-1, :, :3], xyz_agrid[1:, :, :3]) @@ -123,7 +122,6 @@ def calc_unit_vector_south( es1 = np.zeros((xyz_agrid.shape[0], xyz_dgrid.shape[1], 3)) es2 = np.zeros((xyz_agrid.shape[0], xyz_dgrid.shape[1], 3)) if grid_type < 3: - pp = xyz_midpoint(xyz_dgrid[:-1, 1:-1, :3], xyz_dgrid[1:, 1:-1, :3]) p2 = np.cross(xyz_agrid[:, :-1, :3], xyz_agrid[:, 1:, :3]) if tile_partitioner.on_tile_bottom(rank): @@ -509,7 +507,6 @@ def calculate_divg_del6( tile_partitioner: TilePartitioner, rank: int, ): - divg_u = sina_v * dyc / dx del6_u = sina_v * dx / dyc divg_v = sina_u * dxc / dy diff --git a/util/pace/util/grid/global_setup.py b/ndsl/ndsl/util/grid/global_setup.py similarity index 99% rename from util/pace/util/grid/global_setup.py rename to ndsl/ndsl/util/grid/global_setup.py index aa97f936..3a4ef92e 100644 --- a/util/pace/util/grid/global_setup.py +++ b/ndsl/ndsl/util/grid/global_setup.py @@ -1,6 +1,6 @@ import math -from pace.util.constants import PI, RADIUS +from ndsl.util.constants import PI, RADIUS from .generation import MetricTerms from .gnomonic import ( diff --git a/util/pace/util/grid/gnomonic.py b/ndsl/ndsl/util/grid/gnomonic.py similarity index 99% rename from util/pace/util/grid/gnomonic.py rename to ndsl/ndsl/util/grid/gnomonic.py index f26af0f2..defbdf5b 100644 --- a/util/pace/util/grid/gnomonic.py +++ b/ndsl/ndsl/util/grid/gnomonic.py @@ -1,6 +1,6 @@ import math -from pace.util.constants import PI +from ndsl.util.constants import PI def _check_shapes(lon, lat): @@ -291,7 +291,6 @@ def _cart_to_latlon(im, q, xs, ys, np): def _mirror_latlon(lon1, lat1, lon2, lat2, lon0, lat0, np): - p0 = _latlon2xyz(lon0, lat0, np) p1 = _latlon2xyz(lon1, lat1, np) p2 = _latlon2xyz(lon2, lat2, np) diff --git a/util/pace/util/grid/helper.py b/ndsl/ndsl/util/grid/helper.py similarity index 83% rename from util/pace/util/grid/helper.py rename to ndsl/ndsl/util/grid/helper.py index 6b3003d1..871d0a02 100644 --- a/util/pace/util/grid/helper.py +++ b/ndsl/ndsl/util/grid/helper.py @@ -3,16 +3,16 @@ import xarray as xr -import pace.util +import ndsl.util # TODO: if we can remove translate tests in favor of checkpointer tests, -# we can remove this "disallowed" import (pace.util does not depend on pace.dsl) +# we can remove this "disallowed" import (ndsl.util does not depend on ndsl.dsl) try: - from pace.dsl.gt4py_utils import split_cartesian_into_storages + from ndsl.dsl.gt4py_utils import split_cartesian_into_storages except ImportError: split_cartesian_into_storages = None -from pace.util import Z_DIM, Z_INTERFACE_DIM, get_fs +from ndsl.util import Z_DIM, Z_INTERFACE_DIM, get_fs from .generation import MetricTerms @@ -23,10 +23,10 @@ class DampingCoefficients: Terms used to compute damping coefficients. """ - divg_u: pace.util.Quantity - divg_v: pace.util.Quantity - del6_u: pace.util.Quantity - del6_v: pace.util.Quantity + divg_u: ndsl.util.Quantity + divg_v: ndsl.util.Quantity + del6_u: ndsl.util.Quantity + del6_v: ndsl.util.Quantity da_min: float da_min_c: float @@ -48,40 +48,40 @@ class HorizontalGridData: Terms defining the horizontal grid. """ - lon: pace.util.Quantity - lat: pace.util.Quantity - lon_agrid: pace.util.Quantity - lat_agrid: pace.util.Quantity - area: pace.util.Quantity - area_64: pace.util.Quantity - rarea: pace.util.Quantity + lon: ndsl.util.Quantity + lat: ndsl.util.Quantity + lon_agrid: ndsl.util.Quantity + lat_agrid: ndsl.util.Quantity + area: ndsl.util.Quantity + area_64: ndsl.util.Quantity + rarea: ndsl.util.Quantity # TODO: refactor this to "area_c" and invert where used - rarea_c: pace.util.Quantity - dx: pace.util.Quantity - dy: pace.util.Quantity - dxc: pace.util.Quantity - dyc: pace.util.Quantity - dxa: pace.util.Quantity - dya: pace.util.Quantity + rarea_c: ndsl.util.Quantity + dx: ndsl.util.Quantity + dy: ndsl.util.Quantity + dxc: ndsl.util.Quantity + dyc: ndsl.util.Quantity + dxa: ndsl.util.Quantity + dya: ndsl.util.Quantity # TODO: refactor usages to invert "normal" versions instead - rdx: pace.util.Quantity - rdy: pace.util.Quantity - rdxc: pace.util.Quantity - rdyc: pace.util.Quantity - rdxa: pace.util.Quantity - rdya: pace.util.Quantity - ee1: pace.util.Quantity - ee2: pace.util.Quantity - es1: pace.util.Quantity - ew2: pace.util.Quantity - a11: pace.util.Quantity - a12: pace.util.Quantity - a21: pace.util.Quantity - a22: pace.util.Quantity - edge_w: pace.util.Quantity - edge_e: pace.util.Quantity - edge_s: pace.util.Quantity - edge_n: pace.util.Quantity + rdx: ndsl.util.Quantity + rdy: ndsl.util.Quantity + rdxc: ndsl.util.Quantity + rdyc: ndsl.util.Quantity + rdxa: ndsl.util.Quantity + rdya: ndsl.util.Quantity + ee1: ndsl.util.Quantity + ee2: ndsl.util.Quantity + es1: ndsl.util.Quantity + ew2: ndsl.util.Quantity + a11: ndsl.util.Quantity + a12: ndsl.util.Quantity + a21: ndsl.util.Quantity + a22: ndsl.util.Quantity + edge_w: ndsl.util.Quantity + edge_e: ndsl.util.Quantity + edge_s: ndsl.util.Quantity + edge_n: ndsl.util.Quantity @classmethod def new_from_metric_terms(cls, metric_terms: MetricTerms) -> "HorizontalGridData": @@ -130,8 +130,8 @@ class VerticalGridData: """ # TODO: make these non-optional, make FloatFieldK a true type and use it - ak: pace.util.Quantity - bk: pace.util.Quantity + ak: ndsl.util.Quantity + bk: ndsl.util.Quantity """ reference pressure (Pa) used to define pressure at vertical interfaces, where p = ak + bk * p_ref @@ -151,7 +151,7 @@ def new_from_metric_terms(cls, metric_terms: MetricTerms) -> "VerticalGridData": @classmethod def from_restart( - cls, restart_path: str, quantity_factory: pace.util.QuantityFactory + cls, restart_path: str, quantity_factory: ndsl.util.QuantityFactory ): fs = get_fs(restart_path) restart_files = fs.ls(restart_path) @@ -183,10 +183,10 @@ def p_ref(self) -> float: return 1e5 @property - def p_interface(self) -> pace.util.Quantity: + def p_interface(self) -> ndsl.util.Quantity: if self._p_interface is None: p_interface_data = self.ak.view[:] + self.bk.view[:] * self.p_ref - self._p_interface = pace.util.Quantity( + self._p_interface = ndsl.util.Quantity( p_interface_data, dims=[Z_INTERFACE_DIM], units="Pa", @@ -195,14 +195,14 @@ def p_interface(self) -> pace.util.Quantity: return self._p_interface @property - def p(self) -> pace.util.Quantity: + def p(self) -> ndsl.util.Quantity: if self._p is None: p_data = ( self.p_interface.view[1:] - self.p_interface.view[:-1] ) / self.p_interface.np.log( self.p_interface.view[1:] / self.p_interface.view[:-1] ) - self._p = pace.util.Quantity( + self._p = ndsl.util.Quantity( p_data, dims=[Z_DIM], units="Pa", @@ -211,14 +211,14 @@ def p(self) -> pace.util.Quantity: return self._p @property - def dp(self) -> pace.util.Quantity: + def dp(self) -> ndsl.util.Quantity: if self._dp_ref is None: dp_ref_data = ( self.ak.view[1:] - self.ak.view[:-1] + (self.bk.view[1:] - self.bk.view[:-1]) * self.p_ref ) - self._dp_ref = pace.util.Quantity( + self._dp_ref = ndsl.util.Quantity( dp_ref_data, dims=[Z_DIM], units="Pa", @@ -243,16 +243,16 @@ class ContravariantGridData: contravariant components. """ - cosa: pace.util.Quantity - cosa_u: pace.util.Quantity - cosa_v: pace.util.Quantity - cosa_s: pace.util.Quantity - sina_u: pace.util.Quantity - sina_v: pace.util.Quantity - rsina: pace.util.Quantity - rsin_u: pace.util.Quantity - rsin_v: pace.util.Quantity - rsin2: pace.util.Quantity + cosa: ndsl.util.Quantity + cosa_u: ndsl.util.Quantity + cosa_v: ndsl.util.Quantity + cosa_s: ndsl.util.Quantity + sina_u: ndsl.util.Quantity + sina_v: ndsl.util.Quantity + rsina: ndsl.util.Quantity + rsin_u: ndsl.util.Quantity + rsin_v: ndsl.util.Quantity + rsin2: ndsl.util.Quantity @classmethod def new_from_metric_terms( @@ -280,14 +280,14 @@ class AngleGridData: Corresponds in the fortran code to sin_sg and cos_sg. """ - sin_sg1: pace.util.Quantity - sin_sg2: pace.util.Quantity - sin_sg3: pace.util.Quantity - sin_sg4: pace.util.Quantity - cos_sg1: pace.util.Quantity - cos_sg2: pace.util.Quantity - cos_sg3: pace.util.Quantity - cos_sg4: pace.util.Quantity + sin_sg1: ndsl.util.Quantity + sin_sg2: ndsl.util.Quantity + sin_sg3: ndsl.util.Quantity + sin_sg4: ndsl.util.Quantity + cos_sg1: ndsl.util.Quantity + cos_sg2: ndsl.util.Quantity + cos_sg3: ndsl.util.Quantity + cos_sg4: ndsl.util.Quantity @classmethod def new_from_metric_terms(cls, metric_terms: MetricTerms) -> "AngleGridData": @@ -339,20 +339,20 @@ def lat(self): return self._horizontal_data.lat @property - def lon_agrid(self) -> pace.util.Quantity: + def lon_agrid(self) -> ndsl.util.Quantity: """longitude on the A-grid (cell centers)""" return self._horizontal_data.lon_agrid @property - def lat_agrid(self) -> pace.util.Quantity: + def lat_agrid(self) -> ndsl.util.Quantity: """latitude on the A-grid (cell centers)""" return self._horizontal_data.lat_agrid @staticmethod - def _fC_from_lat(lat: pace.util.Quantity) -> pace.util.Quantity: + def _fC_from_lat(lat: ndsl.util.Quantity) -> ndsl.util.Quantity: np = lat.np - data = 2.0 * pace.util.constants.OMEGA * np.sin(lat.data) - return pace.util.Quantity( + data = 2.0 * ndsl.util.constants.OMEGA * np.sin(lat.data) + return ndsl.util.Quantity( data, units="1/s", dims=lat.dims, @@ -455,19 +455,19 @@ def rdya(self): return self._horizontal_data.rdya @property - def ee1(self) -> pace.util.Quantity: + def ee1(self) -> ndsl.util.Quantity: return self._horizontal_data.ee1 @property - def ee2(self) -> pace.util.Quantity: + def ee2(self) -> ndsl.util.Quantity: return self._horizontal_data.ee2 @property - def es1(self) -> pace.util.Quantity: + def es1(self) -> ndsl.util.Quantity: return self._horizontal_data.es1 @property - def ew2(self) -> pace.util.Quantity: + def ew2(self) -> ndsl.util.Quantity: return self._horizontal_data.ew2 @property @@ -511,14 +511,14 @@ def p_ref(self) -> float: return self._vertical_data.p_ref @property - def p(self) -> pace.util.Quantity: + def p(self) -> ndsl.util.Quantity: """ Reference pressure profile for Eulerian grid, defined at cell centers. """ return self._vertical_data.p @property - def ak(self) -> pace.util.Quantity: + def ak(self) -> ndsl.util.Quantity: """ constant used to define pressure at vertical interfaces, where p = ak + bk * p_ref @@ -526,11 +526,11 @@ def ak(self) -> pace.util.Quantity: return self._vertical_data.ak @ak.setter - def ak(self, value: pace.util.Quantity): + def ak(self, value: ndsl.util.Quantity): self._vertical_data.ak = value @property - def bk(self) -> pace.util.Quantity: + def bk(self) -> ndsl.util.Quantity: """ constant used to define pressure at vertical interfaces, where p = ak + bk * p_ref @@ -538,7 +538,7 @@ def bk(self) -> pace.util.Quantity: return self._vertical_data.bk @bk.setter - def bk(self, value: pace.util.Quantity): + def bk(self, value: ndsl.util.Quantity): self._vertical_data.bk = value @property @@ -559,7 +559,7 @@ def ptop(self, value): self._vertical_data.ptop = value @property - def dp_ref(self) -> pace.util.Quantity: + def dp_ref(self) -> ndsl.util.Quantity: return self._vertical_data.dp @property @@ -658,22 +658,22 @@ class DriverGridData: ew2_3: z-component of grid local unit vector in y-direction at cell edge """ - vlon1: pace.util.Quantity - vlon2: pace.util.Quantity - vlon3: pace.util.Quantity - vlat1: pace.util.Quantity - vlat2: pace.util.Quantity - vlat3: pace.util.Quantity - edge_vect_w: pace.util.Quantity - edge_vect_e: pace.util.Quantity - edge_vect_s: pace.util.Quantity - edge_vect_n: pace.util.Quantity - es1_1: pace.util.Quantity - es1_2: pace.util.Quantity - es1_3: pace.util.Quantity - ew2_1: pace.util.Quantity - ew2_2: pace.util.Quantity - ew2_3: pace.util.Quantity + vlon1: ndsl.util.Quantity + vlon2: ndsl.util.Quantity + vlon3: ndsl.util.Quantity + vlat1: ndsl.util.Quantity + vlat2: ndsl.util.Quantity + vlat3: ndsl.util.Quantity + edge_vect_w: ndsl.util.Quantity + edge_vect_e: ndsl.util.Quantity + edge_vect_s: ndsl.util.Quantity + edge_vect_n: ndsl.util.Quantity + es1_1: ndsl.util.Quantity + es1_2: ndsl.util.Quantity + es1_3: ndsl.util.Quantity + ew2_1: ndsl.util.Quantity + ew2_2: ndsl.util.Quantity + ew2_3: ndsl.util.Quantity grid_type: int @classmethod @@ -693,14 +693,14 @@ def new_from_metric_terms(cls, metric_terms: MetricTerms) -> "DriverGridData": @classmethod def new_from_grid_variables( cls, - vlon: pace.util.Quantity, - vlat: pace.util.Quantity, - edge_vect_n: pace.util.Quantity, - edge_vect_s: pace.util.Quantity, - edge_vect_e: pace.util.Quantity, - edge_vect_w: pace.util.Quantity, - es1: pace.util.Quantity, - ew2: pace.util.Quantity, + vlon: ndsl.util.Quantity, + vlat: ndsl.util.Quantity, + edge_vect_n: ndsl.util.Quantity, + edge_vect_s: ndsl.util.Quantity, + edge_vect_e: ndsl.util.Quantity, + edge_vect_w: ndsl.util.Quantity, + es1: ndsl.util.Quantity, + ew2: ndsl.util.Quantity, grid_type: int = 0, ) -> "DriverGridData": try: @@ -747,7 +747,7 @@ def split_quantity_along_last_dim(quantity): return_list = [] for i in range(quantity.data.shape[-1]): return_list.append( - pace.util.Quantity( + ndsl.util.Quantity( data=quantity.data[..., i], dims=quantity.dims[:-1], units=quantity.units, diff --git a/util/pace/util/grid/mirror.py b/ndsl/ndsl/util/grid/mirror.py similarity index 99% rename from util/pace/util/grid/mirror.py rename to ndsl/ndsl/util/grid/mirror.py index 6c3c7837..c727af3b 100644 --- a/util/pace/util/grid/mirror.py +++ b/ndsl/ndsl/util/grid/mirror.py @@ -1,4 +1,4 @@ -from pace.util.constants import PI, RADIUS +from ndsl.util.constants import PI, RADIUS __all__ = ["mirror_grid"] @@ -38,7 +38,6 @@ def mirror_grid( # first fix base region for j in range(jstart, jend + 1): for i in range(istart, iend + 1): - iend_domain = iend - 1 + ng jend_domain = jend - 1 + ng x1 = np.multiply( @@ -71,7 +70,6 @@ def mirror_grid( mirror_data["north-south"][i, -(j + 1), 0] = 0 if tile_index > 0: - for j in range(jstart, jend + 1): x1 = mirror_data["local"][istart : iend + 1, j, 0] y1 = mirror_data["local"][istart : iend + 1, j, 1] @@ -215,7 +213,6 @@ def mirror_grid( def _rot_3d(axis, p, angle, np, right_hand_grid, degrees=False, convert=False): - if convert: p1 = _spherical_to_cartesian(p, np, right_hand_grid) else: diff --git a/util/pace/util/grid/stretch_transformation.py b/ndsl/ndsl/util/grid/stretch_transformation.py similarity index 99% rename from util/pace/util/grid/stretch_transformation.py rename to ndsl/ndsl/util/grid/stretch_transformation.py index 2c1b16cd..e85ef709 100644 --- a/util/pace/util/grid/stretch_transformation.py +++ b/ndsl/ndsl/util/grid/stretch_transformation.py @@ -3,7 +3,7 @@ import numpy as np -from pace.util import Quantity +from ndsl.util import Quantity T = TypeVar("T", bound=Union[Quantity, np.ndarray]) diff --git a/util/pace/util/halo_data_transformer.py b/ndsl/ndsl/util/halo_data_transformer.py similarity index 100% rename from util/pace/util/halo_data_transformer.py rename to ndsl/ndsl/util/halo_data_transformer.py diff --git a/util/pace/util/halo_updater.py b/ndsl/ndsl/util/halo_updater.py similarity index 100% rename from util/pace/util/halo_updater.py rename to ndsl/ndsl/util/halo_updater.py diff --git a/util/pace/util/initialization/__init__.py b/ndsl/ndsl/util/initialization/__init__.py similarity index 100% rename from util/pace/util/initialization/__init__.py rename to ndsl/ndsl/util/initialization/__init__.py diff --git a/util/pace/util/initialization/allocator.py b/ndsl/ndsl/util/initialization/allocator.py similarity index 100% rename from util/pace/util/initialization/allocator.py rename to ndsl/ndsl/util/initialization/allocator.py diff --git a/util/pace/util/initialization/sizer.py b/ndsl/ndsl/util/initialization/sizer.py similarity index 100% rename from util/pace/util/initialization/sizer.py rename to ndsl/ndsl/util/initialization/sizer.py diff --git a/util/pace/util/io.py b/ndsl/ndsl/util/io.py similarity index 100% rename from util/pace/util/io.py rename to ndsl/ndsl/util/io.py diff --git a/util/pace/util/local_comm.py b/ndsl/ndsl/util/local_comm.py similarity index 100% rename from util/pace/util/local_comm.py rename to ndsl/ndsl/util/local_comm.py diff --git a/util/pace/util/logging.py b/ndsl/ndsl/util/logging.py similarity index 100% rename from util/pace/util/logging.py rename to ndsl/ndsl/util/logging.py diff --git a/util/pace/util/monitor/__init__.py b/ndsl/ndsl/util/monitor/__init__.py similarity index 100% rename from util/pace/util/monitor/__init__.py rename to ndsl/ndsl/util/monitor/__init__.py diff --git a/util/pace/util/monitor/convert.py b/ndsl/ndsl/util/monitor/convert.py similarity index 100% rename from util/pace/util/monitor/convert.py rename to ndsl/ndsl/util/monitor/convert.py diff --git a/util/pace/util/monitor/netcdf_monitor.py b/ndsl/ndsl/util/monitor/netcdf_monitor.py similarity index 99% rename from util/pace/util/monitor/netcdf_monitor.py rename to ndsl/ndsl/util/monitor/netcdf_monitor.py index abcb7fe3..7c00ee08 100644 --- a/util/pace/util/monitor/netcdf_monitor.py +++ b/ndsl/ndsl/util/monitor/netcdf_monitor.py @@ -5,7 +5,7 @@ import fsspec import numpy as np -from pace.util.communicator import Communicator +from ndsl.util.communicator import Communicator from .. import _xarray as xr from ..filesystem import get_fs diff --git a/util/pace/util/monitor/protocol.py b/ndsl/ndsl/util/monitor/protocol.py similarity index 90% rename from util/pace/util/monitor/protocol.py rename to ndsl/ndsl/util/monitor/protocol.py index 6319aebb..fdbb778a 100644 --- a/util/pace/util/monitor/protocol.py +++ b/ndsl/ndsl/util/monitor/protocol.py @@ -1,6 +1,6 @@ from typing import Dict, Protocol -from pace.util.quantity import Quantity +from ndsl.util.quantity import Quantity class Monitor(Protocol): diff --git a/util/pace/util/monitor/zarr_monitor.py b/ndsl/ndsl/util/monitor/zarr_monitor.py similarity index 100% rename from util/pace/util/monitor/zarr_monitor.py rename to ndsl/ndsl/util/monitor/zarr_monitor.py diff --git a/util/pace/util/mpi.py b/ndsl/ndsl/util/mpi.py similarity index 100% rename from util/pace/util/mpi.py rename to ndsl/ndsl/util/mpi.py diff --git a/util/pace/util/namelist.py b/ndsl/ndsl/util/namelist.py similarity index 100% rename from util/pace/util/namelist.py rename to ndsl/ndsl/util/namelist.py diff --git a/util/pace/util/nudging.py b/ndsl/ndsl/util/nudging.py similarity index 100% rename from util/pace/util/nudging.py rename to ndsl/ndsl/util/nudging.py diff --git a/util/pace/util/null_comm.py b/ndsl/ndsl/util/null_comm.py similarity index 98% rename from util/pace/util/null_comm.py rename to ndsl/ndsl/util/null_comm.py index c4fd5ebb..b6cbb02e 100644 --- a/util/pace/util/null_comm.py +++ b/ndsl/ndsl/util/null_comm.py @@ -1,7 +1,7 @@ import copy from typing import Any, Mapping -from pace.util.comm import Comm, Request +from ndsl.util.comm import Comm, Request class NullAsyncResult(Request): diff --git a/util/pace/util/partitioner.py b/ndsl/ndsl/util/partitioner.py similarity index 100% rename from util/pace/util/partitioner.py rename to ndsl/ndsl/util/partitioner.py diff --git a/util/pace/util/quantity.py b/ndsl/ndsl/util/quantity.py similarity index 98% rename from util/pace/util/quantity.py rename to ndsl/ndsl/util/quantity.py index 313e5e74..ccc65ead 100644 --- a/util/pace/util/quantity.py +++ b/ndsl/ndsl/util/quantity.py @@ -297,7 +297,7 @@ def __init__( """ # ToDo: [Florian 01/23] Kill the abomination. # See https://github.com/NOAA-GFDL/pace/issues/3 - from pace.dsl.typing import Float + from ndsl.dsl.typing import Float if ( not allow_mismatch_float_precision @@ -545,7 +545,7 @@ def transpose( Args: target_dims: a list of output dimensions. Instead of a single dimension name, an iterable of dimensions can be used instead for any entries. - For example, you may want to use pace.util.X_DIMS to place an + For example, you may want to use ndsl.util.X_DIMS to place an x-dimension without knowing whether it is on cell centers or interfaces. Returns: @@ -558,17 +558,17 @@ def transpose( Examples: Let's say we have a cell-centered variable: - >>> import pace.util + >>> import ndsl.util >>> import numpy as np - >>> quantity = pace.util.Quantity( + >>> quantity = ndsl.util.Quantity( ... data=np.zeros([2, 3, 4]), - ... dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + ... dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], ... units="m", ... ) If you know you are working with cell-centered variables, you can do: - >>> from pace.util import X_DIM, Y_DIM, Z_DIM + >>> from ndsl.util import X_DIM, Y_DIM, Z_DIM >>> transposed_quantity = quantity.transpose([X_DIM, Y_DIM, Z_DIM]) To support re-ordering without checking whether quantities are on @@ -576,7 +576,7 @@ def transpose( names for dimensions. For example, to re-order to X-Y-Z dimensions regardless of the grid the variable is on, one could do: - >>> from pace.util import X_DIMS, Y_DIMS, Z_DIMS + >>> from ndsl.util import X_DIMS, Y_DIMS, Z_DIMS >>> transposed_quantity = quantity.transpose([X_DIMS, Y_DIMS, Z_DIMS]) """ target_dims = _collapse_dims(target_dims, self.dims) diff --git a/util/pace/util/restart_properties.yml b/ndsl/ndsl/util/restart_properties.yml similarity index 100% rename from util/pace/util/restart_properties.yml rename to ndsl/ndsl/util/restart_properties.yml diff --git a/util/pace/util/rotate.py b/ndsl/ndsl/util/rotate.py similarity index 100% rename from util/pace/util/rotate.py rename to ndsl/ndsl/util/rotate.py diff --git a/util/pace/util/testing/__init__.py b/ndsl/ndsl/util/testing/__init__.py similarity index 100% rename from util/pace/util/testing/__init__.py rename to ndsl/ndsl/util/testing/__init__.py diff --git a/util/pace/util/testing/comparison.py b/ndsl/ndsl/util/testing/comparison.py similarity index 100% rename from util/pace/util/testing/comparison.py rename to ndsl/ndsl/util/testing/comparison.py diff --git a/util/pace/util/testing/dummy_comm.py b/ndsl/ndsl/util/testing/dummy_comm.py similarity index 100% rename from util/pace/util/testing/dummy_comm.py rename to ndsl/ndsl/util/testing/dummy_comm.py diff --git a/util/pace/util/testing/perturbation.py b/ndsl/ndsl/util/testing/perturbation.py similarity index 100% rename from util/pace/util/testing/perturbation.py rename to ndsl/ndsl/util/testing/perturbation.py diff --git a/util/pace/util/time.py b/ndsl/ndsl/util/time.py similarity index 100% rename from util/pace/util/time.py rename to ndsl/ndsl/util/time.py diff --git a/util/pace/util/types.py b/ndsl/ndsl/util/types.py similarity index 100% rename from util/pace/util/types.py rename to ndsl/ndsl/util/types.py diff --git a/util/pace/util/units.py b/ndsl/ndsl/util/units.py similarity index 100% rename from util/pace/util/units.py rename to ndsl/ndsl/util/units.py diff --git a/util/pace/util/utils.py b/ndsl/ndsl/util/utils.py similarity index 100% rename from util/pace/util/utils.py rename to ndsl/ndsl/util/utils.py diff --git a/ndsl/requirements.txt b/ndsl/requirements.txt new file mode 100644 index 00000000..314bdd6d --- /dev/null +++ b/ndsl/requirements.txt @@ -0,0 +1,2 @@ +-e external/gt4py +-e external/dace diff --git a/util/setup.cfg b/ndsl/setup.cfg similarity index 100% rename from util/setup.cfg rename to ndsl/setup.cfg diff --git a/dsl/setup.py b/ndsl/setup.py similarity index 73% rename from dsl/setup.py rename to ndsl/setup.py index 448fce83..ea326781 100644 --- a/dsl/setup.py +++ b/ndsl/setup.py @@ -5,14 +5,13 @@ setup_requirements: List[str] = [] -requirements = ["gt4py", "pace-util", "dace"] +requirements = ["gt4py", "dace", "pace-util"] test_requirements: List[str] = [] setup( - author="Allen Institute for AI", - author_email="elynnw@allenai.org", + author="NOAA/NASA", python_requires=">=3.8", classifiers=[ "Development Status :: 2 - Pre-Alpha", @@ -26,11 +25,11 @@ install_requires=requirements, setup_requires=setup_requirements, tests_require=test_requirements, - name="pace-dsl", + name="ndsl", license="BSD license", - packages=find_namespace_packages(include=["pace.*"]), + packages=find_namespace_packages(include=["ndsl.*"]), include_package_data=True, - url="https://github.com/ai2cm/pace", - version="0.2.0", + url="https://github.com/NOAA-GFDL/NDSL", + version="0.0.0", zip_safe=False, ) diff --git a/util/tests/checkpointer/test_snapshot.py b/ndsl/tests/checkpointer/test_snapshot.py similarity index 87% rename from util/tests/checkpointer/test_snapshot.py rename to ndsl/tests/checkpointer/test_snapshot.py index 5ed9a894..ebf33763 100644 --- a/util/tests/checkpointer/test_snapshot.py +++ b/ndsl/tests/checkpointer/test_snapshot.py @@ -1,8 +1,8 @@ import numpy as np import pytest -import pace.util -from pace.util._optional_imports import xarray as xr +import ndsl.util +from ndsl.util._optional_imports import xarray as xr requires_xarray = pytest.mark.skipif(xr is None, reason="xarray is not installed") @@ -10,13 +10,13 @@ @requires_xarray def test_snapshot_checkpointer_no_data(): - checkpointer = pace.util.SnapshotCheckpointer(rank=0) + checkpointer = ndsl.util.SnapshotCheckpointer(rank=0) xr.testing.assert_identical(checkpointer.dataset, xr.Dataset()) @requires_xarray def test_snapshot_checkpointer_one_snapshot(): - checkpointer = pace.util.SnapshotCheckpointer(rank=0) + checkpointer = ndsl.util.SnapshotCheckpointer(rank=0) val1 = np.random.randn(2, 3, 4) checkpointer("savepoint_name", val1=val1) xr.testing.assert_identical( @@ -35,7 +35,7 @@ def test_snapshot_checkpointer_one_snapshot(): @requires_xarray def test_snapshot_checkpointer_multiple_snapshots(): - checkpointer = pace.util.SnapshotCheckpointer(rank=0) + checkpointer = ndsl.util.SnapshotCheckpointer(rank=0) val1 = np.random.randn(2, 2, 3, 4) val2 = np.random.randn(1, 3, 2, 4) checkpointer("savepoint_name_1", val1=val1[0, :]) diff --git a/util/tests/checkpointer/test_thresholds.py b/ndsl/tests/checkpointer/test_thresholds.py similarity index 98% rename from util/tests/checkpointer/test_thresholds.py rename to ndsl/tests/checkpointer/test_thresholds.py index 498ad265..57a671ac 100644 --- a/util/tests/checkpointer/test_thresholds.py +++ b/ndsl/tests/checkpointer/test_thresholds.py @@ -1,7 +1,7 @@ import numpy as np import pytest -from pace.util.checkpointer import ( +from ndsl.util.checkpointer import ( InsufficientTrialsError, Threshold, ThresholdCalibrationCheckpointer, diff --git a/util/tests/checkpointer/test_validation.py b/ndsl/tests/checkpointer/test_validation.py similarity index 98% rename from util/tests/checkpointer/test_validation.py rename to ndsl/tests/checkpointer/test_validation.py index 2ef06dc3..ef78bad2 100644 --- a/util/tests/checkpointer/test_validation.py +++ b/ndsl/tests/checkpointer/test_validation.py @@ -4,13 +4,13 @@ import numpy as np import pytest -from pace.util._optional_imports import xarray as xr -from pace.util.checkpointer import ( +from ndsl.util._optional_imports import xarray as xr +from ndsl.util.checkpointer import ( SavepointThresholds, Threshold, ValidationCheckpointer, ) -from pace.util.checkpointer.validation import _clip_pace_array_to_target +from ndsl.util.checkpointer.validation import _clip_pace_array_to_target requires_xarray = pytest.mark.skipif(xr is None, reason="xarray is not installed") diff --git a/util/tests/conftest.py b/ndsl/tests/conftest.py similarity index 100% rename from util/tests/conftest.py rename to ndsl/tests/conftest.py diff --git a/util/tests/data/c12_restart/coupler.res b/ndsl/tests/data/c12_restart/coupler.res similarity index 100% rename from util/tests/data/c12_restart/coupler.res rename to ndsl/tests/data/c12_restart/coupler.res diff --git a/util/tests/data/coupler.res b/ndsl/tests/data/coupler.res similarity index 100% rename from util/tests/data/coupler.res rename to ndsl/tests/data/coupler.res diff --git a/util/tests/data/coupler_julian.res b/ndsl/tests/data/coupler_julian.res similarity index 100% rename from util/tests/data/coupler_julian.res rename to ndsl/tests/data/coupler_julian.res diff --git a/util/tests/data/coupler_noleap.res b/ndsl/tests/data/coupler_noleap.res similarity index 100% rename from util/tests/data/coupler_noleap.res rename to ndsl/tests/data/coupler_noleap.res diff --git a/util/tests/data/coupler_thirty_day.res b/ndsl/tests/data/coupler_thirty_day.res similarity index 100% rename from util/tests/data/coupler_thirty_day.res rename to ndsl/tests/data/coupler_thirty_day.res diff --git a/util/tests/mpi/mpi_comm.py b/ndsl/tests/mpi/mpi_comm.py similarity index 100% rename from util/tests/mpi/mpi_comm.py rename to ndsl/tests/mpi/mpi_comm.py diff --git a/util/tests/mpi/test_mpi_halo_update.py b/ndsl/tests/mpi/test_mpi_halo_update.py similarity index 74% rename from util/tests/mpi/test_mpi_halo_update.py rename to ndsl/tests/mpi/test_mpi_halo_update.py index 06f00fc6..441be13e 100644 --- a/util/tests/mpi/test_mpi_halo_update.py +++ b/ndsl/tests/mpi/test_mpi_halo_update.py @@ -3,7 +3,7 @@ import pytest from mpi_comm import MPI -import pace.util +import ndsl.util @pytest.fixture @@ -57,26 +57,26 @@ def n_points_update(request, n_points): @pytest.fixture( params=[ - pytest.param((pace.util.Y_DIM, pace.util.X_DIM), id="center"), + pytest.param((ndsl.util.Y_DIM, ndsl.util.X_DIM), id="center"), pytest.param( - (pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM), id="center_3d" + (ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM), id="center_3d" ), pytest.param( - (pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM), id="center_3d_reverse", ), pytest.param( - (pace.util.X_DIM, pace.util.Z_DIM, pace.util.Y_DIM), + (ndsl.util.X_DIM, ndsl.util.Z_DIM, ndsl.util.Y_DIM), id="center_3d_shuffle", ), pytest.param( - (pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM), id="interface" + (ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM), id="interface" ), pytest.param( ( - pace.util.Z_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, - pace.util.X_INTERFACE_DIM, + ndsl.util.Z_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, ), id="interface_3d", ), @@ -110,12 +110,12 @@ def n_buffer(request): def shape(nz, ny, nx, dims, n_points, n_buffer): return_list = [] length_dict = { - pace.util.X_DIM: 2 * n_points + nx + n_buffer, - pace.util.X_INTERFACE_DIM: 2 * n_points + nx + 1 + n_buffer, - pace.util.Y_DIM: 2 * n_points + ny + n_buffer, - pace.util.Y_INTERFACE_DIM: 2 * n_points + ny + 1 + n_buffer, - pace.util.Z_DIM: nz + n_buffer, - pace.util.Z_INTERFACE_DIM: nz + 1 + n_buffer, + ndsl.util.X_DIM: 2 * n_points + nx + n_buffer, + ndsl.util.X_INTERFACE_DIM: 2 * n_points + nx + 1 + n_buffer, + ndsl.util.Y_DIM: 2 * n_points + ny + n_buffer, + ndsl.util.Y_INTERFACE_DIM: 2 * n_points + ny + 1 + n_buffer, + ndsl.util.Z_DIM: nz + n_buffer, + ndsl.util.Z_INTERFACE_DIM: nz + 1 + n_buffer, } for dim in dims: return_list.append(length_dict[dim]) @@ -126,12 +126,12 @@ def shape(nz, ny, nx, dims, n_points, n_buffer): def origin(n_points, dims): return_list = [] origin_dict = { - pace.util.X_DIM: n_points, - pace.util.X_INTERFACE_DIM: n_points, - pace.util.Y_DIM: n_points, - pace.util.Y_INTERFACE_DIM: n_points, - pace.util.Z_DIM: 0, - pace.util.Z_INTERFACE_DIM: 0, + ndsl.util.X_DIM: n_points, + ndsl.util.X_INTERFACE_DIM: n_points, + ndsl.util.Y_DIM: n_points, + ndsl.util.Y_INTERFACE_DIM: n_points, + ndsl.util.Z_DIM: 0, + ndsl.util.Z_INTERFACE_DIM: 0, } for dim in dims: return_list.append(origin_dict[dim]) @@ -142,12 +142,12 @@ def origin(n_points, dims): def extent(n_points, dims, nz, ny, nx): return_list = [] extent_dict = { - pace.util.X_DIM: nx, - pace.util.X_INTERFACE_DIM: nx + 1, - pace.util.Y_DIM: ny, - pace.util.Y_INTERFACE_DIM: ny + 1, - pace.util.Z_DIM: nz, - pace.util.Z_INTERFACE_DIM: nz + 1, + ndsl.util.X_DIM: nx, + ndsl.util.X_INTERFACE_DIM: nx + 1, + ndsl.util.Y_DIM: ny, + ndsl.util.Y_INTERFACE_DIM: ny + 1, + ndsl.util.Z_DIM: nz, + ndsl.util.Z_INTERFACE_DIM: nz + 1, } for dim in dims: return_list.append(extent_dict[dim]) @@ -156,7 +156,7 @@ def extent(n_points, dims, nz, ny, nx): @pytest.fixture() def communicator(cube_partitioner): - return pace.util.CubedSphereCommunicator( + return ndsl.util.CubedSphereCommunicator( comm=MPI.COMM_WORLD, partitioner=cube_partitioner, ) @@ -169,12 +169,12 @@ def edge_interior_ratio(request): @pytest.fixture def tile_partitioner(layout, edge_interior_ratio: float): - return pace.util.TilePartitioner(layout, edge_interior_ratio=edge_interior_ratio) + return ndsl.util.TilePartitioner(layout, edge_interior_ratio=edge_interior_ratio) @pytest.fixture def cube_partitioner(tile_partitioner): - return pace.util.CubedSpherePartitioner(tile_partitioner) + return ndsl.util.CubedSpherePartitioner(tile_partitioner) @pytest.fixture @@ -182,16 +182,16 @@ def updated_slice(ny, nx, dims, n_points, n_points_update): n_points_remain = n_points - n_points_update return_list = [] length_dict = { - pace.util.X_DIM: slice(n_points_remain, n_points + nx + n_points_update), - pace.util.X_INTERFACE_DIM: slice( + ndsl.util.X_DIM: slice(n_points_remain, n_points + nx + n_points_update), + ndsl.util.X_INTERFACE_DIM: slice( n_points_remain, n_points + nx + 1 + n_points_update ), - pace.util.Y_DIM: slice(n_points_remain, n_points + ny + n_points_update), - pace.util.Y_INTERFACE_DIM: slice( + ndsl.util.Y_DIM: slice(n_points_remain, n_points + ny + n_points_update), + ndsl.util.Y_INTERFACE_DIM: slice( n_points_remain, n_points + ny + 1 + n_points_update ), - pace.util.Z_DIM: slice(None, None), - pace.util.Z_INTERFACE_DIM: slice(None, None), + ndsl.util.Z_DIM: slice(None, None), + ndsl.util.Z_INTERFACE_DIM: slice(None, None), } for dim in dims: return_list.append(length_dict[dim]) @@ -207,33 +207,33 @@ def remaining_ones(nz, ny, nx, n_points, n_points_update): @pytest.fixture def boundary_dict(ranks_per_tile): if ranks_per_tile == 1: - return {0: pace.util.EDGE_BOUNDARY_TYPES} + return {0: ndsl.util.EDGE_BOUNDARY_TYPES} elif ranks_per_tile == 4: return { - 0: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHWEST, pace.util.NORTHEAST, pace.util.SOUTHEAST), - 1: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHWEST, pace.util.NORTHEAST, pace.util.SOUTHWEST), - 2: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHEAST, pace.util.SOUTHWEST, pace.util.SOUTHEAST), - 3: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHWEST, pace.util.SOUTHWEST, pace.util.SOUTHEAST), + 0: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHWEST, ndsl.util.NORTHEAST, ndsl.util.SOUTHEAST), + 1: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHWEST, ndsl.util.NORTHEAST, ndsl.util.SOUTHWEST), + 2: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHEAST, ndsl.util.SOUTHWEST, ndsl.util.SOUTHEAST), + 3: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHWEST, ndsl.util.SOUTHWEST, ndsl.util.SOUTHEAST), } elif ranks_per_tile == 9: return { - 0: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHWEST, pace.util.NORTHEAST, pace.util.SOUTHEAST), - 1: pace.util.BOUNDARY_TYPES, - 2: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHWEST, pace.util.NORTHEAST, pace.util.SOUTHWEST), - 3: pace.util.BOUNDARY_TYPES, - 4: pace.util.BOUNDARY_TYPES, - 5: pace.util.BOUNDARY_TYPES, - 6: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHEAST, pace.util.SOUTHWEST, pace.util.SOUTHEAST), - 7: pace.util.BOUNDARY_TYPES, - 8: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHWEST, pace.util.SOUTHWEST, pace.util.SOUTHEAST), + 0: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHWEST, ndsl.util.NORTHEAST, ndsl.util.SOUTHEAST), + 1: ndsl.util.BOUNDARY_TYPES, + 2: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHWEST, ndsl.util.NORTHEAST, ndsl.util.SOUTHWEST), + 3: ndsl.util.BOUNDARY_TYPES, + 4: ndsl.util.BOUNDARY_TYPES, + 5: ndsl.util.BOUNDARY_TYPES, + 6: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHEAST, ndsl.util.SOUTHWEST, ndsl.util.SOUTHEAST), + 7: ndsl.util.BOUNDARY_TYPES, + 8: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHWEST, ndsl.util.SOUTHWEST, ndsl.util.SOUTHEAST), } else: raise NotImplementedError(ranks_per_tile) @@ -249,7 +249,7 @@ def depth_quantity( data[:] = numpy.nan for n_inside in range(max(n_points, max(extent) // 2), -1, -1): for i, dim in enumerate(dims): - if (n_inside <= extent[i] // 2) and (dim in pace.util.HORIZONTAL_DIMS): + if (n_inside <= extent[i] // 2) and (dim in ndsl.util.HORIZONTAL_DIMS): pos = [slice(None, None)] * len(dims) pos[i] = origin[i] + n_inside data[tuple(pos)] = n_inside @@ -257,13 +257,13 @@ def depth_quantity( data[tuple(pos)] = n_inside for n_outside in range(1, n_points + 1 + n_buffer): for i, dim in enumerate(dims): - if dim in pace.util.HORIZONTAL_DIMS: + if dim in ndsl.util.HORIZONTAL_DIMS: pos = [slice(None, None)] * len(dims) pos[i] = origin[i] - n_outside data[tuple(pos)] = numpy.nan pos[i] = origin[i] + extent[i] + n_outside - 1 data[tuple(pos)] = numpy.nan - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( data, dims=dims, units=units, @@ -313,7 +313,7 @@ def zeros_quantity(dims, units, origin, extent, shape, numpy, dtype): """A list of quantities whose values are 0 in the computational domain and 1 outside of it.""" data = numpy.ones(shape, dtype=dtype) - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( data, dims=dims, units=units, @@ -343,7 +343,7 @@ def test_zeros_halo_update( communicator.halo_update(quantity, n_points_update) boundaries = boundary_dict[communicator.rank % ranks_per_tile] for boundary in boundaries: - boundary_slice = pace.util._boundary_utils.get_boundary_slice( + boundary_slice = ndsl.util._boundary_utils.get_boundary_slice( quantity.dims, quantity.origin, quantity.extent, @@ -383,7 +383,7 @@ def test_zeros_vector_halo_update( communicator.vector_halo_update(y_quantity, x_quantity, n_points_update) boundaries = boundary_dict[communicator.rank % ranks_per_tile] for boundary in boundaries: - boundary_slice = pace.util._boundary_utils.get_boundary_slice( + boundary_slice = ndsl.util._boundary_utils.get_boundary_slice( x_quantity.dims, x_quantity.origin, x_quantity.extent, @@ -405,13 +405,13 @@ def test_zeros_vector_halo_update( def get_horizontal_dims(dims): - for dim in pace.util.X_DIMS: + for dim in ndsl.util.X_DIMS: if dim in dims: x_dim = dim break else: raise ValueError(f"no x dimension in {dims}") - for dim in pace.util.Y_DIMS: + for dim in ndsl.util.Y_DIMS: if dim in dims: y_dim = dim break diff --git a/util/tests/mpi/test_mpi_mock.py b/ndsl/tests/mpi/test_mpi_mock.py similarity index 91% rename from util/tests/mpi/test_mpi_mock.py rename to ndsl/tests/mpi/test_mpi_mock.py index e1efe760..8a47619b 100644 --- a/util/tests/mpi/test_mpi_mock.py +++ b/ndsl/tests/mpi/test_mpi_mock.py @@ -2,7 +2,7 @@ import pytest from mpi_comm import MPI -import pace.util +import ndsl.util worker_function_list = [] @@ -31,11 +31,11 @@ def send_recv(comm, numpy): data = numpy.asarray([rank], dtype=numpy.int) if rank < size - 1: - if isinstance(comm, pace.util.testing.DummyComm): + if isinstance(comm, ndsl.util.testing.DummyComm): print(f"sending data from {rank} to {rank + 1}") comm.Send(data, dest=rank + 1) if rank > 0: - if isinstance(comm, pace.util.testing.DummyComm): + if isinstance(comm, ndsl.util.testing.DummyComm): print(f"recieving data from {rank - 1} to {rank}") comm.Recv(data, source=rank - 1) return data @@ -48,11 +48,11 @@ def send_recv_big_data(comm, numpy): data = numpy.ones([5, 3, 96], dtype=numpy.float64) * rank if rank < size - 1: - if isinstance(comm, pace.util.testing.DummyComm): + if isinstance(comm, ndsl.util.testing.DummyComm): print(f"sending data from {rank} to {rank + 1}") comm.Send(data, dest=rank + 1) if rank > 0: - if isinstance(comm, pace.util.testing.DummyComm): + if isinstance(comm, ndsl.util.testing.DummyComm): print(f"recieving data from {rank - 1} to {rank}") comm.Recv(data, source=rank - 1) return data @@ -79,7 +79,7 @@ def send_recv_multiple_async_calls(comm, numpy): for from_rank in range(size): if from_rank != rank: - with pace.util.recv_buffer(numpy, recv_data[from_rank, :]) as recvbuf: + with ndsl.util.recv_buffer(numpy, recv_data[from_rank, :]) as recvbuf: comm.Recv(recvbuf, source=from_rank, tag=0) for req in req_list: req.wait() @@ -94,11 +94,11 @@ def send_f_contiguous_buffer(comm, numpy): data = numpy.random.uniform(size=[2, 3]).T if rank < size - 1: - if isinstance(comm, pace.util.testing.DummyComm): + if isinstance(comm, ndsl.util.testing.DummyComm): print(f"sending data from {rank} to {rank + 1}") comm.Send(data, dest=rank + 1) if rank > 0: - if isinstance(comm, pace.util.testing.DummyComm): + if isinstance(comm, ndsl.util.testing.DummyComm): print(f"recieving data from {rank - 1} to {rank}") comm.Recv(data, source=rank - 1) return data @@ -113,7 +113,7 @@ def send_non_contiguous_buffer(comm, numpy): recv_buffer = numpy.zeros([4, 2, 3]) if rank < size - 1: - if isinstance(comm, pace.util.testing.DummyComm): + if isinstance(comm, ndsl.util.testing.DummyComm): print(f"sending data from {rank} to {rank + 1}") comm.Send(data, dest=rank + 1) if rank > 0: @@ -130,7 +130,7 @@ def send_subarray(comm, numpy): recv_buffer = numpy.zeros([2, 2, 2]) if rank < size - 1: - if isinstance(comm, pace.util.testing.DummyComm): + if isinstance(comm, ndsl.util.testing.DummyComm): print(f"sending data from {rank} to {rank + 1}") comm.Send(data[1:-1, 1:-1, 1:-1], dest=rank + 1) if rank > 0: @@ -149,11 +149,11 @@ def recv_to_subarray(comm, numpy): return_value = recv_buffer if rank < size - 1: - if isinstance(comm, pace.util.testing.DummyComm): + if isinstance(comm, ndsl.util.testing.DummyComm): print(f"sending data from {rank} to {rank + 1}") comm.Send(data, dest=rank + 1) if rank > 0: - if isinstance(comm, pace.util.testing.DummyComm): + if isinstance(comm, ndsl.util.testing.DummyComm): print(f"recieving data from {rank - 1} to {rank}") try: comm.Recv(recv_buffer[1:-1, 1:-1, 1:-1], source=rank - 1) @@ -253,7 +253,7 @@ def dummy_list(total_ranks): return_list = [] for rank in range(total_ranks): return_list.append( - pace.util.testing.DummyComm( + ndsl.util.testing.DummyComm( rank=rank, total_ranks=total_ranks, buffer_dict=shared_buffer ) ) @@ -283,7 +283,7 @@ def dummy_results(worker_function, dummy_list, numpy): comm = dummy_list[i] try: result_list[i] = worker_function(comm, numpy) - except pace.util.testing.ConcurrencyError as err: + except ndsl.util.testing.ConcurrencyError as err: if iter_count >= MAX_WORKER_ITERATIONS: result_list[i] = err else: diff --git a/util/tests/quantity/test_boundary.py b/ndsl/tests/quantity/test_boundary.py similarity index 66% rename from util/tests/quantity/test_boundary.py rename to ndsl/tests/quantity/test_boundary.py index 9f818f34..7cf35480 100644 --- a/util/tests/quantity/test_boundary.py +++ b/ndsl/tests/quantity/test_boundary.py @@ -1,8 +1,8 @@ import numpy as np import pytest -import pace.util -from pace.util._boundary_utils import _shift_boundary_slice, get_boundary_slice +import ndsl.util +from ndsl.util._boundary_utils import _shift_boundary_slice, get_boundary_slice def boundary_data(quantity, boundary_type, n_points, interior=True): @@ -20,18 +20,18 @@ def boundary_data(quantity, boundary_type, n_points, interior=True): @pytest.mark.cpu_only def test_boundary_data_1_by_1_array_1_halo(): - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( np.random.randn(3, 3), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="m", origin=(1, 1), extent=(1, 1), ) for side in ( - pace.util.WEST, - pace.util.EAST, - pace.util.NORTH, - pace.util.SOUTH, + ndsl.util.WEST, + ndsl.util.EAST, + ndsl.util.NORTH, + ndsl.util.SOUTH, ): assert ( boundary_data(quantity, side, n_points=1, interior=True) @@ -39,36 +39,36 @@ def test_boundary_data_1_by_1_array_1_halo(): ) assert ( - boundary_data(quantity, pace.util.NORTH, n_points=1, interior=False) + boundary_data(quantity, ndsl.util.NORTH, n_points=1, interior=False) == quantity.data[2, 1] ) assert ( - boundary_data(quantity, pace.util.SOUTH, n_points=1, interior=False) + boundary_data(quantity, ndsl.util.SOUTH, n_points=1, interior=False) == quantity.data[0, 1] ) assert ( - boundary_data(quantity, pace.util.WEST, n_points=1, interior=False) + boundary_data(quantity, ndsl.util.WEST, n_points=1, interior=False) == quantity.data[1, 0] ) assert ( - boundary_data(quantity, pace.util.EAST, n_points=1, interior=False) + boundary_data(quantity, ndsl.util.EAST, n_points=1, interior=False) == quantity.data[1, 2] ) def test_boundary_data_3d_array_1_halo_z_offset_origin(numpy): - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( numpy.random.randn(2, 3, 3), - dims=[pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], units="m", origin=(1, 1, 1), extent=(1, 1, 1), ) for side in ( - pace.util.WEST, - pace.util.EAST, - pace.util.NORTH, - pace.util.SOUTH, + ndsl.util.WEST, + ndsl.util.EAST, + ndsl.util.NORTH, + ndsl.util.SOUTH, ): quantity.np.testing.assert_array_equal( boundary_data(quantity, side, n_points=1, interior=True), @@ -76,37 +76,37 @@ def test_boundary_data_3d_array_1_halo_z_offset_origin(numpy): ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.NORTH, n_points=1, interior=False), + boundary_data(quantity, ndsl.util.NORTH, n_points=1, interior=False), quantity.data[1, 2, 1], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.SOUTH, n_points=1, interior=False), + boundary_data(quantity, ndsl.util.SOUTH, n_points=1, interior=False), quantity.data[1, 0, 1], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.WEST, n_points=1, interior=False), + boundary_data(quantity, ndsl.util.WEST, n_points=1, interior=False), quantity.data[1, 1, 0], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.EAST, n_points=1, interior=False), + boundary_data(quantity, ndsl.util.EAST, n_points=1, interior=False), quantity.data[1, 1, 2], ) @pytest.mark.cpu_only def test_boundary_data_2_by_2_array_2_halo(): - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( np.random.randn(6, 6), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="m", origin=(2, 2), extent=(2, 2), ) for side in ( - pace.util.WEST, - pace.util.EAST, - pace.util.NORTH, - pace.util.SOUTH, + ndsl.util.WEST, + ndsl.util.EAST, + ndsl.util.NORTH, + ndsl.util.SOUTH, ): np.testing.assert_array_equal( boundary_data(quantity, side, n_points=2, interior=True), @@ -114,51 +114,51 @@ def test_boundary_data_2_by_2_array_2_halo(): ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.NORTH, n_points=1, interior=True), + boundary_data(quantity, ndsl.util.NORTH, n_points=1, interior=True), quantity.data[3:4, 2:4], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.NORTH, n_points=1, interior=False), + boundary_data(quantity, ndsl.util.NORTH, n_points=1, interior=False), quantity.data[4:5, 2:4], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.NORTH, n_points=2, interior=False), + boundary_data(quantity, ndsl.util.NORTH, n_points=2, interior=False), quantity.data[4:6, 2:4], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.SOUTH, n_points=1, interior=True), + boundary_data(quantity, ndsl.util.SOUTH, n_points=1, interior=True), quantity.data[2:3, 2:4], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.SOUTH, n_points=1, interior=False), + boundary_data(quantity, ndsl.util.SOUTH, n_points=1, interior=False), quantity.data[1:2, 2:4], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.SOUTH, n_points=2, interior=False), + boundary_data(quantity, ndsl.util.SOUTH, n_points=2, interior=False), quantity.data[0:2, 2:4], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.WEST, n_points=2, interior=False), + boundary_data(quantity, ndsl.util.WEST, n_points=2, interior=False), quantity.data[2:4, 0:2], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.WEST, n_points=1, interior=True), + boundary_data(quantity, ndsl.util.WEST, n_points=1, interior=True), quantity.data[2:4, 2:3], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.WEST, n_points=1, interior=False), + boundary_data(quantity, ndsl.util.WEST, n_points=1, interior=False), quantity.data[2:4, 1:2], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.EAST, n_points=1, interior=False), + boundary_data(quantity, ndsl.util.EAST, n_points=1, interior=False), quantity.data[2:4, 4:5], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.EAST, n_points=2, interior=False), + boundary_data(quantity, ndsl.util.EAST, n_points=2, interior=False), quantity.data[2:4, 4:6], ) quantity.np.testing.assert_array_equal( - boundary_data(quantity, pace.util.EAST, n_points=1, interior=True), + boundary_data(quantity, ndsl.util.EAST, n_points=1, interior=True), quantity.data[2:4, 3:4], ) @@ -167,82 +167,82 @@ def test_boundary_data_2_by_2_array_2_halo(): "dim, origin, extent, boundary_type, slice_object, reference", [ pytest.param( - pace.util.X_DIM, + ndsl.util.X_DIM, 1, 3, - pace.util.WEST, + ndsl.util.WEST, slice(None, None), slice(1, 4), id="none_is_changed", ), pytest.param( - pace.util.Y_DIM, + ndsl.util.Y_DIM, 1, 3, - pace.util.WEST, + ndsl.util.WEST, slice(None, None), slice(1, 4), id="perpendicular_none_is_changed", ), pytest.param( - pace.util.X_DIM, + ndsl.util.X_DIM, 1, 3, - pace.util.WEST, + ndsl.util.WEST, slice(0, 1), slice(1, 2), id="shift_to_start", ), pytest.param( - pace.util.X_DIM, + ndsl.util.X_DIM, 1, 3, - pace.util.WEST, + ndsl.util.WEST, slice(0, 2), slice(1, 3), id="shift_larger_to_start", ), pytest.param( - pace.util.X_DIM, + ndsl.util.X_DIM, 1, 3, - pace.util.EAST, + ndsl.util.EAST, slice(0, 1), slice(4, 5), id="shift_to_end", ), pytest.param( - pace.util.X_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, 1, 3, - pace.util.WEST, + ndsl.util.WEST, slice(0, 1), slice(1, 2), id="shift_interface_to_start", ), pytest.param( - pace.util.X_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, 1, 3, - pace.util.EAST, + ndsl.util.EAST, slice(0, 1), slice(4, 5), id="shift_interface_to_end", ), pytest.param( - pace.util.Y_DIM, + ndsl.util.Y_DIM, 2, 4, - pace.util.SOUTH, + ndsl.util.SOUTH, slice(0, 1), slice(2, 3), id="shift_y_to_start", ), pytest.param( - pace.util.Y_DIM, + ndsl.util.Y_DIM, 2, 4, - pace.util.NORTH, + ndsl.util.NORTH, slice(0, 1), slice(6, 7), id="shift_y_to_end", diff --git a/util/tests/quantity/test_corners.py b/ndsl/tests/quantity/test_corners.py similarity index 92% rename from util/tests/quantity/test_corners.py rename to ndsl/tests/quantity/test_corners.py index 0b922b49..e85a8447 100644 --- a/util/tests/quantity/test_corners.py +++ b/ndsl/tests/quantity/test_corners.py @@ -1,7 +1,7 @@ import numpy as np import pytest -import pace.util +import ndsl.util @pytest.fixture @@ -11,7 +11,7 @@ def units(): @pytest.fixture def dims(request): - return [pace.util.X_DIM, pace.util.Y_DIM] + return [ndsl.util.X_DIM, ndsl.util.Y_DIM] @pytest.fixture @@ -36,14 +36,14 @@ def layout(request): @pytest.fixture def quantity(shape, dims, units, origin, extent, numpy): - return pace.util.Quantity( + return ndsl.util.Quantity( numpy.zeros(shape), dims=dims, units=units, origin=origin, extent=extent ) @pytest.fixture def tile_partitioner(layout): - return pace.util.TilePartitioner(layout) + return ndsl.util.TilePartitioner(layout) @pytest.fixture @@ -73,7 +73,7 @@ def test_fill_scalar_corners_copies_from_halo( quantity.view.northwest[-n_halo:0, 0:n_halo] = quantity.np.nan quantity.view.northeast[0:n_halo, 0:n_halo] = quantity.np.nan quantity.view[:] = 2 - pace.util.fill_scalar_corners( + ndsl.util.fill_scalar_corners( quantity=quantity, direction=direction, tile_partitioner=tile_partitioner, @@ -100,7 +100,7 @@ def test_fill_scalar_corners_copies_from_halo( "quantity_in, direction, layout, rank, n_halo, reference", [ pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array( [ [0, 1, 2, 3, 4, 5], @@ -111,7 +111,7 @@ def test_fill_scalar_corners_copies_from_halo( [30, 31, 32, 33, 34, 35], ] ).T, - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(2, 2), extent=(2, 2), @@ -133,7 +133,7 @@ def test_fill_scalar_corners_copies_from_halo( id="all_corners_x", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array( [ [0, 1, 2, 0, 3, 4, 5], @@ -145,7 +145,7 @@ def test_fill_scalar_corners_copies_from_halo( [30, 31, 32, 6, 33, 34, 35], ] ).T, - dims=[pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + dims=[ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], units="m", origin=(2, 2), extent=(3, 3), @@ -168,7 +168,7 @@ def test_fill_scalar_corners_copies_from_halo( id="all_corners_x_interfaces", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array( [ [0, 1, 2, 3, 4, 5], @@ -180,7 +180,7 @@ def test_fill_scalar_corners_copies_from_halo( [30, 31, 32, 33, 34, 35], ] ).T, - dims=[pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], units="m", origin=(2, 2), extent=(2, 3), @@ -203,7 +203,7 @@ def test_fill_scalar_corners_copies_from_halo( id="all_corners_x_one_iface_dim", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array( [ [0, 1, 2, 0, 3, 4, 5], @@ -215,7 +215,7 @@ def test_fill_scalar_corners_copies_from_halo( [30, 31, 32, 6, 33, 34, 35], ] ).T, - dims=[pace.util.X_INTERFACE_DIM, pace.util.Y_INTERFACE_DIM], + dims=[ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_INTERFACE_DIM], units="m", origin=(2, 2), extent=(3, 3), @@ -238,7 +238,7 @@ def test_fill_scalar_corners_copies_from_halo( id="all_corners_y_interfaces", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array( [ [0, 1, 2, 3, 4, 5], @@ -249,7 +249,7 @@ def test_fill_scalar_corners_copies_from_halo( [30, 31, 32, 33, 34, 35], ] ).T, - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(2, 2), extent=(2, 2), @@ -271,7 +271,7 @@ def test_fill_scalar_corners_copies_from_halo( id="one_corner_x", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array( [ [0, 1, 2, 3, 4, 5], @@ -282,7 +282,7 @@ def test_fill_scalar_corners_copies_from_halo( [30, 31, 32, 33, 34, 35], ] ).T, - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(2, 2), extent=(2, 2), @@ -310,7 +310,7 @@ def test_fill_scalar_corners_copies_from_halo( def test_fill_corners( quantity_in, direction, tile_partitioner, rank, n_halo, reference ): - pace.util.fill_scalar_corners( + ndsl.util.fill_scalar_corners( quantity=quantity_in, direction=direction, tile_partitioner=tile_partitioner, diff --git a/util/tests/quantity/test_deepcopy.py b/ndsl/tests/quantity/test_deepcopy.py similarity index 91% rename from util/tests/quantity/test_deepcopy.py rename to ndsl/tests/quantity/test_deepcopy.py index 502bd000..fa5b6a7c 100644 --- a/util/tests/quantity/test_deepcopy.py +++ b/ndsl/tests/quantity/test_deepcopy.py @@ -3,12 +3,12 @@ import numpy as np -import pace.util +import ndsl.util def test_deepcopy_copy_is_editable_by_view(): nx, ny, nz = 12, 12, 15 - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( np.zeros([nx, ny, nz]), origin=(0, 0, 0), extent=(nx, ny, nz), @@ -27,7 +27,7 @@ def test_deepcopy_copy_is_editable_by_view(): def test_deepcopy_copy_is_editable_by_data(): nx, ny, nz = 12, 12, 15 - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( np.zeros([nx, ny, nz]), origin=(0, 0, 0), extent=(nx, ny, nz), @@ -42,7 +42,7 @@ def test_deepcopy_copy_is_editable_by_data(): def test_deepcopy_of_dataclass_is_editable_by_data(): nx, ny, nz = 12, 12, 15 - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( np.zeros([nx, ny, nz]), origin=(0, 0, 0), extent=(nx, ny, nz), @@ -54,7 +54,7 @@ def test_deepcopy_of_dataclass_is_editable_by_data(): @dataclasses.dataclass class MyClass: - quantity: pace.util.Quantity + quantity: ndsl.util.Quantity instance = MyClass(quantity) instance_copy = copy.deepcopy(instance) diff --git a/util/tests/quantity/test_quantity.py b/ndsl/tests/quantity/test_quantity.py similarity index 95% rename from util/tests/quantity/test_quantity.py rename to ndsl/tests/quantity/test_quantity.py index 051e244d..1bd2c20d 100644 --- a/util/tests/quantity/test_quantity.py +++ b/ndsl/tests/quantity/test_quantity.py @@ -1,8 +1,8 @@ import numpy as np import pytest -import pace.util -import pace.util.quantity +import ndsl.util +import ndsl.util.quantity try: @@ -69,7 +69,7 @@ def data(n_halo, extent_1d, n_dims, numpy, dtype): @pytest.fixture def quantity(data, origin, extent, dims, units): - return pace.util.Quantity( + return ndsl.util.Quantity( data, origin=origin, extent=extent, dims=dims, units=units ) @@ -82,28 +82,28 @@ def test_smaller_data_raises(data, origin, extent, dims, units): pass else: with pytest.raises(ValueError): - pace.util.Quantity( + ndsl.util.Quantity( small_data, origin=origin, extent=extent, dims=dims, units=units ) def test_smaller_dims_raises(data, origin, extent, dims, units): with pytest.raises(ValueError): - pace.util.Quantity( + ndsl.util.Quantity( data, origin=origin, extent=extent, dims=dims[:-1], units=units ) def test_smaller_origin_raises(data, origin, extent, dims, units): with pytest.raises(ValueError): - pace.util.Quantity( + ndsl.util.Quantity( data, origin=origin[:-1], extent=extent, dims=dims, units=units ) def test_smaller_extent_raises(data, origin, extent, dims, units): with pytest.raises(ValueError): - pace.util.Quantity( + ndsl.util.Quantity( data, origin=origin, extent=extent[:-1], dims=dims, units=units ) @@ -237,29 +237,29 @@ def test_compute_view_edit_all_domain(quantity, n_halo, n_dims, extent_1d): ], ) def test_shift_slice(slice_in, shift, extent, slice_out): - result = pace.util.quantity.shift_slice(slice_in, shift, extent) + result = ndsl.util.quantity.shift_slice(slice_in, shift, extent) assert result == slice_out @pytest.mark.parametrize( "quantity", [ - pace.util.Quantity( + ndsl.util.Quantity( np.array(5), dims=[], units="", ), - pace.util.Quantity( + ndsl.util.Quantity( np.array([1, 2, 3]), dims=["dimension"], units="degK", ), - pace.util.Quantity( + ndsl.util.Quantity( np.random.randn(3, 2, 4), dims=["dim1", "dim_2", "dimension_3"], units="m", ), - pace.util.Quantity( + ndsl.util.Quantity( np.random.randn(8, 6, 6), dims=["dim1", "dim_2", "dimension_3"], units="km", diff --git a/util/tests/quantity/test_storage.py b/ndsl/tests/quantity/test_storage.py similarity index 95% rename from util/tests/quantity/test_storage.py rename to ndsl/tests/quantity/test_storage.py index a92e6a85..5b0b1407 100644 --- a/util/tests/quantity/test_storage.py +++ b/ndsl/tests/quantity/test_storage.py @@ -1,7 +1,7 @@ import numpy as np import pytest -import pace.util +import ndsl.util try: @@ -62,7 +62,7 @@ def data(n_halo, extent_1d, n_dims, numpy, dtype): @pytest.fixture def quantity(data, origin, extent, dims, units): - return pace.util.Quantity( + return ndsl.util.Quantity( data, origin=origin, extent=extent, dims=dims, units=units ) @@ -78,7 +78,7 @@ def test_numpy(quantity, backend): def test_modifying_numpy_data_modifies_view(): shape = (6, 6) data = np.zeros(shape, dtype=float) - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( data, origin=(0, 0), extent=shape, @@ -110,7 +110,7 @@ def test_data_exists(quantity, backend): def test_accessing_data_does_not_break_view( data, origin, extent, dims, units, gt4py_backend ): - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( data, origin=origin, extent=extent, @@ -128,7 +128,7 @@ def test_numpy_data_becomes_cupy_with_gpu_backend( data, origin, extent, dims, units, gt4py_backend ): cpu_data = np.zeros(data.shape) - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( cpu_data, origin=origin, extent=extent, diff --git a/util/tests/quantity/test_transpose.py b/ndsl/tests/quantity/test_transpose.py similarity index 81% rename from util/tests/quantity/test_transpose.py rename to ndsl/tests/quantity/test_transpose.py index 164c7dee..01ef9d58 100644 --- a/util/tests/quantity/test_transpose.py +++ b/ndsl/tests/quantity/test_transpose.py @@ -1,6 +1,6 @@ import pytest -import pace.util +import ndsl.util @pytest.fixture @@ -71,7 +71,7 @@ def final_data(initial_data, transpose_order, numpy): @pytest.fixture def quantity(quantity_data_input, initial_dims, initial_origin, initial_extent): - return pace.util.Quantity( + return ndsl.util.Quantity( quantity_data_input, dims=initial_dims, units="unit_string", @@ -98,56 +98,56 @@ def param_product(*param_lists): ), [ pytest.param( - (pace.util.X_DIM, pace.util.Y_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_DIM), (6, 7), (1, 2), (2, 3), - (pace.util.X_DIM, pace.util.Y_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_DIM), (0, 1), id="2d_keep_order", ), pytest.param( - (pace.util.X_DIM, pace.util.Y_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_DIM), (6, 7), (1, 2), (2, 3), - (pace.util.Y_DIM, pace.util.X_DIM), + (ndsl.util.Y_DIM, ndsl.util.X_DIM), (1, 0), id="2d_transpose", ), pytest.param( - (pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM), (6, 7, 8), (1, 2, 3), (2, 3, 4), - (pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM), (0, 1, 2), id="3d_keep_order", ), pytest.param( - (pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM), (6, 7, 8), (1, 2, 3), (2, 3, 4), - (pace.util.X_DIMS, pace.util.Y_DIMS, pace.util.Z_DIMS), + (ndsl.util.X_DIMS, ndsl.util.Y_DIMS, ndsl.util.Z_DIMS), (0, 1, 2), id="3d_keep_order_list_dims", ), pytest.param( - (pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM), (6, 7, 8), (1, 2, 3), (2, 3, 4), - (pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM), + (ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM), (2, 1, 0), id="3d_transpose", ), pytest.param( - (pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM), (6, 7, 8), (1, 2, 3), (2, 3, 4), - (pace.util.Z_DIMS, pace.util.Y_DIMS, pace.util.X_DIMS), + (ndsl.util.Z_DIMS, ndsl.util.Y_DIMS, ndsl.util.X_DIMS), (2, 1, 0), id="3d_transpose_list_dims", ), @@ -174,23 +174,23 @@ def test_transpose( ), [ pytest.param( - (pace.util.X_DIM,), (6,), (1,), (2,), (pace.util.Y_DIM,), (0,), id="1d" + (ndsl.util.X_DIM,), (6,), (1,), (2,), (ndsl.util.Y_DIM,), (0,), id="1d" ), pytest.param( - (pace.util.X_DIM, pace.util.Y_INTERFACE_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM), (6, 7), (1, 2), (2, 3), - (pace.util.X_DIM, pace.util.Y_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_DIM), (0, 1), id="2d_switch_stagger", ), pytest.param( - (pace.util.X_DIM, pace.util.Y_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_DIM), (6, 7), (1, 2), (2, 3), - (pace.util.Y_DIM, pace.util.X_INTERFACE_DIM), + (ndsl.util.Y_DIM, ndsl.util.X_INTERFACE_DIM), (1, 0), id="2d_transpose_switch_stagger", ), @@ -205,7 +205,7 @@ def test_transpose_invalid_cases( def test_transpose_retains_attrs(numpy): - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( numpy.random.randn(3, 4), dims=["x", "y"], units="unit_string" ) quantity._attrs = {"long_name": "500 mb height"} diff --git a/util/tests/quantity/test_view.py b/ndsl/tests/quantity/test_view.py similarity index 83% rename from util/tests/quantity/test_view.py rename to ndsl/tests/quantity/test_view.py index c571673c..537a1775 100644 --- a/util/tests/quantity/test_view.py +++ b/ndsl/tests/quantity/test_view.py @@ -1,12 +1,12 @@ import numpy as np import pytest -import pace.util +import ndsl.util @pytest.fixture def quantity(request): - return pace.util.Quantity( + return ndsl.util.Quantity( request.param[0], dims=request.param[1], units="units", @@ -21,9 +21,9 @@ def quantity(request): # "quantity, view_slice, reference", # [ # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -33,9 +33,9 @@ def quantity(request): # id="3_by_3_center_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([1, 2, 3]), -# dims=[pace.util.X_DIM], +# dims=[ndsl.util.X_DIM], # units="m", # origin=(1,), # extent=(1,), @@ -45,9 +45,9 @@ def quantity(request): # id="3_1d_left_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -57,9 +57,9 @@ def quantity(request): # id="3_by_3_center_value_as_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -69,9 +69,9 @@ def quantity(request): # id="3_by_3_first_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -81,9 +81,9 @@ def quantity(request): # id="3_by_3_first_value_as_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -93,7 +93,7 @@ def quantity(request): # id="3_by_3_default_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array( # [ # [0, 1, 2, 3, 4], @@ -103,7 +103,7 @@ def quantity(request): # [20, 21, 22, 23, 24], # ] # ), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(2, 2), # extent=(1, 1), @@ -113,7 +113,7 @@ def quantity(request): # id="5_by_5_mostly_halo_default_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array( # [ # [0, 1, 2, 3, 4], @@ -123,7 +123,7 @@ def quantity(request): # [20, 21, 22, 23, 24], # ] # ), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(2, 2), # extent=(1, 1), @@ -133,7 +133,7 @@ def quantity(request): # id="5_by_5_larger_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array( # [ # [0, 1, 2, 3, 4], @@ -143,7 +143,7 @@ def quantity(request): # [20, 21, 22, 23, 24], # ] # ), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(3, 2), # extent=(1, 1), @@ -159,7 +159,7 @@ def quantity(request): # quantity.np.testing.assert_array_equal(result, reference) # # result should be a slice of the quantity memory, if it's a slice # assert len(result.shape) == 0 or result.base is quantity.data -# transposed_quantity = pace.util.Quantity( +# transposed_quantity = ndsl.util.Quantity( # quantity.data.T, # dims=quantity.dims[::-1], # units=quantity.units, @@ -176,9 +176,9 @@ def quantity(request): @pytest.mark.parametrize( "quantity", [ - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -209,9 +209,9 @@ def test_many_indices_raises(quantity, view_name): @pytest.mark.parametrize( "quantity", [ - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -243,9 +243,9 @@ def test_many_slices_raises(quantity, view_name): # "quantity, view_slice, reference", # [ # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -255,9 +255,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_center_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([1, 2, 3]), -# dims=[pace.util.X_DIM], +# dims=[ndsl.util.X_DIM], # units="m", # origin=(1,), # extent=(1,), @@ -267,9 +267,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_1d_right_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -279,9 +279,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_center_value_as_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -291,9 +291,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_first_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -303,9 +303,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_first_value_as_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -315,7 +315,7 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_default_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array( # [ # [0, 1, 2, 3, 4], @@ -325,7 +325,7 @@ def test_many_slices_raises(quantity, view_name): # [20, 21, 22, 23, 24], # ] # ), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(2, 2), # extent=(1, 1), @@ -335,7 +335,7 @@ def test_many_slices_raises(quantity, view_name): # id="5_by_5_mostly_halo_default_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array( # [ # [0, 1, 2, 3, 4], @@ -345,7 +345,7 @@ def test_many_slices_raises(quantity, view_name): # [20, 21, 22, 23, 24], # ] # ), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(2, 2), # extent=(1, 1), @@ -355,7 +355,7 @@ def test_many_slices_raises(quantity, view_name): # id="5_by_5_larger_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array( # [ # [0, 1, 2, 3, 4], @@ -365,7 +365,7 @@ def test_many_slices_raises(quantity, view_name): # [20, 21, 22, 23, 24], # ] # ), -# dims=[pace.util.X_DIM, pace.util.Y_DIM], +# dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], # units="m", # origin=(1, 2), # extent=(1, 1), @@ -381,7 +381,7 @@ def test_many_slices_raises(quantity, view_name): # quantity.np.testing.assert_array_equal(result, reference) # # result should be a slice of the quantity memory, if it's a slice # assert len(result.shape) == 0 or result.base is quantity.data -# transposed_quantity = pace.util.Quantity( +# transposed_quantity = ndsl.util.Quantity( # quantity.data.T, # dims=quantity.dims[::-1], # units=quantity.units, @@ -399,9 +399,9 @@ def test_many_slices_raises(quantity, view_name): # "quantity, view_slice, reference", # [ # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -411,9 +411,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_center_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([1, 2, 3]), -# dims=[pace.util.Y_DIM], +# dims=[ndsl.util.Y_DIM], # units="m", # origin=(1,), # extent=(1,), @@ -423,9 +423,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_1d_bottom_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([1, 2, 3]), -# dims=[pace.util.Y_INTERFACE_DIM], +# dims=[ndsl.util.Y_INTERFACE_DIM], # units="m", # origin=(1,), # extent=(1,), @@ -435,9 +435,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_1d_bottom_interface_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -447,9 +447,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_center_value_as_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -459,9 +459,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_first_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -471,9 +471,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_first_value_as_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -483,7 +483,7 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_default_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array( # [ # [0, 1, 2, 3, 4], @@ -493,7 +493,7 @@ def test_many_slices_raises(quantity, view_name): # [20, 21, 22, 23, 24], # ] # ), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(2, 2), # extent=(1, 1), @@ -503,7 +503,7 @@ def test_many_slices_raises(quantity, view_name): # id="5_by_5_mostly_halo_default_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array( # [ # [0, 1, 2, 3, 4], @@ -513,7 +513,7 @@ def test_many_slices_raises(quantity, view_name): # [20, 21, 22, 23, 24], # ] # ), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(2, 2), # extent=(1, 1), @@ -523,7 +523,7 @@ def test_many_slices_raises(quantity, view_name): # id="5_by_5_larger_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array( # [ # [0, 1, 2, 3, 4], @@ -533,7 +533,7 @@ def test_many_slices_raises(quantity, view_name): # [20, 21, 22, 23, 24], # ] # ), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(3, 2), # extent=(1, 1), @@ -549,7 +549,7 @@ def test_many_slices_raises(quantity, view_name): # quantity.np.testing.assert_array_equal(result, reference) # # result should be a slice of the quantity memory, if it's a slice # assert len(result.shape) == 0 or result.base is quantity.data -# transposed_quantity = pace.util.Quantity( +# transposed_quantity = ndsl.util.Quantity( # quantity.data.T, # dims=quantity.dims[::-1], # units=quantity.units, @@ -567,9 +567,9 @@ def test_many_slices_raises(quantity, view_name): # "quantity, view_slice, reference", # [ # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -579,9 +579,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_center_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([1, 2, 3]), -# dims=[pace.util.Y_DIM], +# dims=[ndsl.util.Y_DIM], # units="m", # origin=(1,), # extent=(1,), @@ -591,9 +591,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_1d_top_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([1, 2, 3]), -# dims=[pace.util.Y_INTERFACE_DIM], +# dims=[ndsl.util.Y_INTERFACE_DIM], # units="m", # origin=(1,), # extent=(1,), @@ -603,9 +603,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_1d_top_interface_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -615,9 +615,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_center_value_as_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -627,9 +627,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_first_value", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -639,9 +639,9 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_first_value_as_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(1, 1), # extent=(1, 1), @@ -651,7 +651,7 @@ def test_many_slices_raises(quantity, view_name): # id="3_by_3_default_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array( # [ # [0, 1, 2, 3, 4], @@ -661,7 +661,7 @@ def test_many_slices_raises(quantity, view_name): # [20, 21, 22, 23, 24], # ] # ), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(2, 2), # extent=(1, 1), @@ -671,7 +671,7 @@ def test_many_slices_raises(quantity, view_name): # id="5_by_5_mostly_halo_default_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array( # [ # [0, 1, 2, 3, 4], @@ -681,7 +681,7 @@ def test_many_slices_raises(quantity, view_name): # [20, 21, 22, 23, 24], # ] # ), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(2, 2), # extent=(1, 1), @@ -691,7 +691,7 @@ def test_many_slices_raises(quantity, view_name): # id="5_by_5_larger_slice", # ), # pytest.param( -# pace.util.Quantity( +# ndsl.util.Quantity( # np.array( # [ # [0, 1, 2, 3, 4], @@ -701,7 +701,7 @@ def test_many_slices_raises(quantity, view_name): # [20, 21, 22, 23, 24], # ] # ), -# dims=[pace.util.Y_DIM, pace.util.X_DIM], +# dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], # units="m", # origin=(1, 2), # extent=(1, 1), @@ -717,7 +717,7 @@ def test_many_slices_raises(quantity, view_name): # quantity.np.testing.assert_array_equal(result, reference) # # result should be a slice of the quantity memory, if it's a slice # assert len(result.shape) == 0 or result.base is quantity.data -# transposed_quantity = pace.util.Quantity( +# transposed_quantity = ndsl.util.Quantity( # quantity.data.T, # dims=quantity.dims[::-1], # units=quantity.units, @@ -735,9 +735,9 @@ def test_many_slices_raises(quantity, view_name): "quantity, view_slice, reference", [ pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -747,9 +747,9 @@ def test_many_slices_raises(quantity, view_name): id="3_by_3_center_value", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -759,9 +759,9 @@ def test_many_slices_raises(quantity, view_name): id="3_by_3_corner", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -771,9 +771,9 @@ def test_many_slices_raises(quantity, view_name): id="3_by_3_corner_as_slice", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -783,7 +783,7 @@ def test_many_slices_raises(quantity, view_name): id="3_by_3_beside_corner", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array( [ [0, 1, 2, 3, 4], @@ -793,7 +793,7 @@ def test_many_slices_raises(quantity, view_name): [20, 21, 22, 23, 24], ] ), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(2, 2), extent=(1, 1), @@ -809,7 +809,7 @@ def test_southwest(quantity, view_slice, reference): quantity.np.testing.assert_array_equal(result, reference) # result should be a slice of the quantity memory, if it's a slice assert len(result.shape) == 0 or result.base is quantity.data - transposed_quantity = pace.util.Quantity( + transposed_quantity = ndsl.util.Quantity( quantity.data.T, dims=quantity.dims[::-1], units=quantity.units, @@ -827,9 +827,9 @@ def test_southwest(quantity, view_slice, reference): "quantity, view_slice, reference", [ pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -839,9 +839,9 @@ def test_southwest(quantity, view_slice, reference): id="3_by_3_center_value", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -851,9 +851,9 @@ def test_southwest(quantity, view_slice, reference): id="3_by_3_corner", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -863,9 +863,9 @@ def test_southwest(quantity, view_slice, reference): id="3_by_3_corner_as_slice", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -875,7 +875,7 @@ def test_southwest(quantity, view_slice, reference): id="3_by_3_beside_corner", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array( [ [0, 1, 2, 3, 4], @@ -885,7 +885,7 @@ def test_southwest(quantity, view_slice, reference): [20, 21, 22, 23, 24], ] ), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(2, 2), extent=(1, 1), @@ -901,7 +901,7 @@ def test_southeast(quantity, view_slice, reference): quantity.np.testing.assert_array_equal(result, reference) # result should be a slice of the quantity memory, if it's a slice assert len(result.shape) == 0 or result.base is quantity.data - transposed_quantity = pace.util.Quantity( + transposed_quantity = ndsl.util.Quantity( quantity.data.T, dims=quantity.dims[::-1], units=quantity.units, @@ -919,9 +919,9 @@ def test_southeast(quantity, view_slice, reference): "quantity, view_slice, reference", [ pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -931,9 +931,9 @@ def test_southeast(quantity, view_slice, reference): id="3_by_3_center_value", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -943,9 +943,9 @@ def test_southeast(quantity, view_slice, reference): id="3_by_3_corner", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -955,9 +955,9 @@ def test_southeast(quantity, view_slice, reference): id="3_by_3_corner_as_slice", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -967,9 +967,9 @@ def test_southeast(quantity, view_slice, reference): id="3_by_3_inside_corner", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -979,7 +979,7 @@ def test_southeast(quantity, view_slice, reference): id="3_by_3_beside_corner", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array( [ [0, 1, 2, 3, 4], @@ -989,7 +989,7 @@ def test_southeast(quantity, view_slice, reference): [20, 21, 22, 23, 24], ] ), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="m", origin=(2, 2), extent=(1, 1), @@ -1005,7 +1005,7 @@ def test_northwest(quantity, view_slice, reference): quantity.np.testing.assert_array_equal(result, reference) # result should be a slice of the quantity memory, if it's a slice assert len(result.shape) == 0 or result.base is quantity.data - transposed_quantity = pace.util.Quantity( + transposed_quantity = ndsl.util.Quantity( quantity.data.T, dims=quantity.dims[::-1], units=quantity.units, @@ -1023,9 +1023,9 @@ def test_northwest(quantity, view_slice, reference): "quantity, view_slice, reference", [ pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -1035,9 +1035,9 @@ def test_northwest(quantity, view_slice, reference): id="3_by_3_center_value", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -1047,9 +1047,9 @@ def test_northwest(quantity, view_slice, reference): id="3_by_3_corner", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -1059,9 +1059,9 @@ def test_northwest(quantity, view_slice, reference): id="3_by_3_corner_as_slice", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -1071,9 +1071,9 @@ def test_northwest(quantity, view_slice, reference): id="3_by_3_inside_corner", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -1083,7 +1083,7 @@ def test_northwest(quantity, view_slice, reference): id="3_by_3_beside_corner", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array( [ [0, 1, 2, 3, 4], @@ -1093,7 +1093,7 @@ def test_northwest(quantity, view_slice, reference): [20, 21, 22, 23, 24], ] ), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(2, 2), extent=(1, 1), @@ -1109,7 +1109,7 @@ def test_northeast(quantity, view_slice, reference): quantity.np.testing.assert_array_equal(result, reference) # result should be a slice of the quantity memory, if it's a slice assert len(result.shape) == 0 or result.base is quantity.data - transposed_quantity = pace.util.Quantity( + transposed_quantity = ndsl.util.Quantity( quantity.data.T, dims=quantity.dims[::-1], units=quantity.units, @@ -1127,9 +1127,9 @@ def test_northeast(quantity, view_slice, reference): "quantity, view_slice, reference", [ pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -1139,9 +1139,9 @@ def test_northeast(quantity, view_slice, reference): id="3_by_3_center_value", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -1151,9 +1151,9 @@ def test_northeast(quantity, view_slice, reference): id="3_by_3_center_value_as_slice", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(1, 1), @@ -1163,7 +1163,7 @@ def test_northeast(quantity, view_slice, reference): id="3_by_3_with_halo", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array( [ [0, 1, 2, 3, 4], @@ -1173,7 +1173,7 @@ def test_northeast(quantity, view_slice, reference): [20, 21, 22, 23, 24], ] ), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(2, 2), extent=(1, 1), @@ -1183,7 +1183,7 @@ def test_northeast(quantity, view_slice, reference): id="5_by_5_larger_slice", ), pytest.param( - pace.util.Quantity( + ndsl.util.Quantity( np.array( [ [0, 1, 2, 3, 4], @@ -1193,7 +1193,7 @@ def test_northeast(quantity, view_slice, reference): [20, 21, 22, 23, 24], ] ), - dims=[pace.util.X_DIM, pace.util.Y_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM], units="m", origin=(1, 1), extent=(3, 3), @@ -1209,7 +1209,7 @@ def test_interior(quantity, view_slice, reference): quantity.np.testing.assert_array_equal(result, reference) # result should be a slice of the quantity memory, if it's a slice assert len(result.shape) == 0 or result.base is quantity.data - transposed_quantity = pace.util.Quantity( + transposed_quantity = ndsl.util.Quantity( quantity.data.T, dims=quantity.dims[::-1], units=quantity.units, diff --git a/util/tests/test__capture_stream.py b/ndsl/tests/test__capture_stream.py similarity index 95% rename from util/tests/test__capture_stream.py rename to ndsl/tests/test__capture_stream.py index 6fec36d5..6db9e7cf 100644 --- a/util/tests/test__capture_stream.py +++ b/ndsl/tests/test__capture_stream.py @@ -4,7 +4,7 @@ import pytest -from pace.util import capture_stream +from ndsl.util import capture_stream def get_libc(): diff --git a/util/tests/test_buffer.py b/ndsl/tests/test_buffer.py similarity index 98% rename from util/tests/test_buffer.py rename to ndsl/tests/test_buffer.py index edd768a1..567deccb 100644 --- a/util/tests/test_buffer.py +++ b/ndsl/tests/test_buffer.py @@ -1,7 +1,7 @@ import pytest -from pace.util.buffer import BUFFER_CACHE, Buffer, recv_buffer, send_buffer -from pace.util.utils import is_c_contiguous, is_contiguous +from ndsl.util.buffer import BUFFER_CACHE, Buffer, recv_buffer, send_buffer +from ndsl.util.utils import is_c_contiguous, is_contiguous @pytest.fixture diff --git a/util/tests/test_caching_comm.py b/ndsl/tests/test_caching_comm.py similarity index 75% rename from util/tests/test_caching_comm.py rename to ndsl/tests/test_caching_comm.py index 1d93eadb..dd34194c 100644 --- a/util/tests/test_caching_comm.py +++ b/ndsl/tests/test_caching_comm.py @@ -4,21 +4,21 @@ import numpy as np -import pace.util -from pace.util.caching_comm import CachingCommReader, CachingCommWriter +import ndsl.util +from ndsl.util.caching_comm import CachingCommReader, CachingCommWriter def test_halo_update_integration(): shape = (18, 18) - dims = [pace.util.X_DIM, pace.util.Y_DIM] + dims = [ndsl.util.X_DIM, ndsl.util.Y_DIM] origin = (3, 3) extent = (12, 12) n_ranks = 6 - partitioner = pace.util.CubedSpherePartitioner( - tile=pace.util.TilePartitioner(layout=(1, 1)) + partitioner = ndsl.util.CubedSpherePartitioner( + tile=ndsl.util.TilePartitioner(layout=(1, 1)) ) quantity_list = [ - pace.util.Quantity( + ndsl.util.Quantity( data=np.random.randn(*shape), dims=dims, units="", @@ -28,12 +28,12 @@ def test_halo_update_integration(): for _ in range(n_ranks) ] buffer_dict = {} - write_communicator_list: List[pace.util.CubedSphereCommunicator] = [] + write_communicator_list: List[ndsl.util.CubedSphereCommunicator] = [] for i in range(n_ranks): write_communicator_list.append( - pace.util.CubedSphereCommunicator( - comm=pace.util.CachingCommWriter( - pace.util.LocalComm( + ndsl.util.CubedSphereCommunicator( + comm=ndsl.util.CachingCommWriter( + ndsl.util.LocalComm( rank=i, total_ranks=n_ranks, buffer_dict=buffer_dict ) ), @@ -43,14 +43,14 @@ def test_halo_update_integration(): local_comm_quantities = copy.deepcopy(quantity_list) perform_serial_halo_updates(write_communicator_list, local_comm_quantities) - read_communicator_list: List[pace.util.CubedSphereCommunicator] = [] + read_communicator_list: List[ndsl.util.CubedSphereCommunicator] = [] for i in range(n_ranks): file = io.BytesIO() write_communicator_list[i].comm.dump(file) file.seek(0) read_communicator_list.append( - pace.util.CubedSphereCommunicator( - comm=pace.util.CachingCommReader.load(file), + ndsl.util.CubedSphereCommunicator( + comm=ndsl.util.CachingCommReader.load(file), partitioner=partitioner, ) ) @@ -60,8 +60,8 @@ def test_halo_update_integration(): def perform_serial_halo_updates( - communicator_list: List[pace.util.CubedSphereCommunicator], - quantity_list: List[pace.util.Quantity], + communicator_list: List[ndsl.util.CubedSphereCommunicator], + quantity_list: List[ndsl.util.Quantity], ): req_list = [] for communicator, quantity in zip(communicator_list, quantity_list): @@ -71,8 +71,8 @@ def perform_serial_halo_updates( def test_Recv_inserts_data(): - comm = pace.util.CachingCommWriter( - comm=pace.util.NullComm(rank=0, total_ranks=6, fill_value=0.0) + comm = ndsl.util.CachingCommWriter( + comm=ndsl.util.NullComm(rank=0, total_ranks=6, fill_value=0.0) ) shape = (12, 12) recvbuf = np.random.randn(*shape) @@ -83,8 +83,8 @@ def test_Recv_inserts_data(): def test_Irecv_inserts_data(): - comm = pace.util.CachingCommWriter( - comm=pace.util.NullComm(rank=0, total_ranks=6, fill_value=0.0) + comm = ndsl.util.CachingCommWriter( + comm=ndsl.util.NullComm(rank=0, total_ranks=6, fill_value=0.0) ) shape = (12, 12) recvbuf = np.random.randn(*shape) @@ -97,8 +97,8 @@ def test_Irecv_inserts_data(): def test_bcast_inserts_data(): - comm = pace.util.CachingCommWriter( - comm=pace.util.NullComm(rank=0, total_ranks=6, fill_value=0.0) + comm = ndsl.util.CachingCommWriter( + comm=ndsl.util.NullComm(rank=0, total_ranks=6, fill_value=0.0) ) shape = (12, 12) recvbuf = np.random.randn(*shape) @@ -123,11 +123,11 @@ def test_Scatter(): send_array = np.empty([2] + list(array.shape)) send_array[:] = array[None, :] buffer_dict = {} - root_comm = pace.util.CachingCommWriter( - comm=pace.util.LocalComm(rank=0, total_ranks=2, buffer_dict=buffer_dict) + root_comm = ndsl.util.CachingCommWriter( + comm=ndsl.util.LocalComm(rank=0, total_ranks=2, buffer_dict=buffer_dict) ) - worker_comm = pace.util.CachingCommWriter( - comm=pace.util.LocalComm(rank=1, total_ranks=2, buffer_dict=buffer_dict) + worker_comm = ndsl.util.CachingCommWriter( + comm=ndsl.util.LocalComm(rank=1, total_ranks=2, buffer_dict=buffer_dict) ) recvbuf_root = np.zeros_like(array) recvbuf_worker = np.zeros_like(array) @@ -151,11 +151,11 @@ def test_Gather(): array_root = np.random.uniform(size=(50,)) array_worker = np.random.uniform(size=(50,)) buffer_dict = {} - root_comm = pace.util.CachingCommWriter( - comm=pace.util.LocalComm(rank=0, total_ranks=2, buffer_dict=buffer_dict) + root_comm = ndsl.util.CachingCommWriter( + comm=ndsl.util.LocalComm(rank=0, total_ranks=2, buffer_dict=buffer_dict) ) - worker_comm = pace.util.CachingCommWriter( - comm=pace.util.LocalComm(rank=1, total_ranks=2, buffer_dict=buffer_dict) + worker_comm = ndsl.util.CachingCommWriter( + comm=ndsl.util.LocalComm(rank=1, total_ranks=2, buffer_dict=buffer_dict) ) recvbuf_root = np.empty([2] + list(array_root.shape)) worker_comm.Gather(array_worker, recvbuf=None, root=0) diff --git a/util/tests/test_cube_scatter_gather.py b/ndsl/tests/test_cube_scatter_gather.py similarity index 89% rename from util/tests/test_cube_scatter_gather.py rename to ndsl/tests/test_cube_scatter_gather.py index 523cb0de..42c96a21 100644 --- a/util/tests/test_cube_scatter_gather.py +++ b/ndsl/tests/test_cube_scatter_gather.py @@ -3,7 +3,7 @@ import pytest -import pace.util +import ndsl.util try: @@ -30,23 +30,23 @@ def n_tile_halo(request): @pytest.fixture(params=["x,y", "y,x", "xi,y", "x,y,z", "z,y,x", "y,z,x"]) def dims(request, fast): if request.param == "x,y": - return [pace.util.X_DIM, pace.util.Y_DIM] + return [ndsl.util.X_DIM, ndsl.util.Y_DIM] elif request.param == "y,x": if fast: pytest.skip("running in fast mode") else: - return [pace.util.Y_DIM, pace.util.X_DIM] + return [ndsl.util.Y_DIM, ndsl.util.X_DIM] elif request.param == "xi,y": - return [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM] + return [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM] elif request.param == "x,y,z": - return [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM] + return [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM] elif request.param == "z,y,x": if fast: pytest.skip("running in fast mode") else: - return [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM] + return [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM] elif request.param == "y,z,x": - return [pace.util.Y_DIM, pace.util.Z_DIM, pace.util.X_DIM] + return [ndsl.util.Y_DIM, ndsl.util.Z_DIM, ndsl.util.X_DIM] else: raise NotImplementedError() @@ -72,12 +72,12 @@ def assert_quantity_equals(result, reference): @pytest.fixture() def dim_lengths(layout): return { - pace.util.X_DIM: 2 * layout[1], - pace.util.X_INTERFACE_DIM: 2 * layout[1] + 1, - pace.util.Y_DIM: 2 * layout[0], - pace.util.Y_INTERFACE_DIM: 2 * layout[0] + 1, - pace.util.Z_DIM: 3, - pace.util.Z_INTERFACE_DIM: 4, + ndsl.util.X_DIM: 2 * layout[1], + ndsl.util.X_INTERFACE_DIM: 2 * layout[1] + 1, + ndsl.util.Y_DIM: 2 * layout[0], + ndsl.util.Y_INTERFACE_DIM: 2 * layout[0] + 1, + ndsl.util.Z_DIM: 3, + ndsl.util.Z_INTERFACE_DIM: 4, } @@ -88,10 +88,10 @@ def communicator_list(layout): return_list = [] for rank in range(total_ranks): return_list.append( - pace.util.CubedSphereCommunicator( - pace.util.testing.DummyComm(rank, total_ranks, shared_buffer), - pace.util.CubedSpherePartitioner(pace.util.TilePartitioner(layout)), - timer=pace.util.Timer(), + ndsl.util.CubedSphereCommunicator( + ndsl.util.testing.DummyComm(rank, total_ranks, shared_buffer), + ndsl.util.CubedSpherePartitioner(ndsl.util.TilePartitioner(layout)), + timer=ndsl.util.Timer(), ) ) return return_list @@ -114,7 +114,7 @@ def cube_quantity(dims, units, dim_lengths, tile_extent, n_tile_halo, numpy): def scattered_quantities(cube_quantity, layout, n_rank_halo, numpy): tile_ranks = layout[0] * layout[1] return_list = [] - partitioner = pace.util.TilePartitioner(layout) + partitioner = ndsl.util.TilePartitioner(layout) for i_tile in range(6): for rank in range(tile_ranks): # partitioner is tested in other tests, here we assume it works @@ -139,7 +139,7 @@ def scattered_quantities(cube_quantity, layout, n_rank_halo, numpy): def get_cube_quantity(dims, units, dim_lengths, tile_extent, n_halo, numpy): extent = [6] + [dim_lengths[dim] for dim in dims] - dims = [pace.util.TILE_DIM] + dims + dims = [ndsl.util.TILE_DIM] + dims quantity = get_quantity(dims, units, extent, n_halo, numpy) quantity.view[:] = numpy.random.randn(*quantity.extent) return quantity @@ -149,10 +149,10 @@ def get_quantity(dims, units, extent, n_halo, numpy): shape = list(copy.deepcopy(extent)) origin = [0 for dim in dims] for i, dim in enumerate(dims): - if dim in pace.util.HORIZONTAL_DIMS: + if dim in ndsl.util.HORIZONTAL_DIMS: origin[i] += n_halo shape[i] += 2 * n_halo - return pace.util.Quantity( + return ndsl.util.Quantity( numpy.zeros(shape), dims, units, diff --git a/util/tests/test_decomposition.py b/ndsl/tests/test_decomposition.py similarity index 94% rename from util/tests/test_decomposition.py rename to ndsl/tests/test_decomposition.py index 352b62a5..3d97ee22 100644 --- a/util/tests/test_decomposition.py +++ b/ndsl/tests/test_decomposition.py @@ -4,15 +4,15 @@ import pytest -from pace.util.decomposition import ( +from ndsl.util.decomposition import ( block_waiting_for_compilation, build_cache_path, check_cached_path_exists, determine_rank_is_compiling, unblock_waiting_tiles, ) -from pace.util.mpi import MPI -from pace.util.partitioner import CubedSpherePartitioner, TilePartitioner +from ndsl.util.mpi import MPI +from ndsl.util.partitioner import CubedSpherePartitioner, TilePartitioner @pytest.mark.parametrize( diff --git a/util/tests/test_dimension_sizer.py b/ndsl/tests/test_dimension_sizer.py similarity index 74% rename from util/tests/test_dimension_sizer.py rename to ndsl/tests/test_dimension_sizer.py index 73f6f4c0..38942073 100644 --- a/util/tests/test_dimension_sizer.py +++ b/ndsl/tests/test_dimension_sizer.py @@ -2,7 +2,7 @@ import pytest -import pace.util +import ndsl.util @pytest.fixture(params=[48, 96]) @@ -60,16 +60,16 @@ def namelist(nx_tile, ny_tile, nz, layout): @pytest.fixture(params=["from_namelist", "from_tile_params"]) def sizer(request, nx_tile, ny_tile, nz, layout, namelist, extra_dimension_lengths): if request.param == "from_tile_params": - sizer = pace.util.SubtileGridSizer.from_tile_params( + sizer = ndsl.util.SubtileGridSizer.from_tile_params( nx_tile, ny_tile, nz, - pace.util.N_HALO_DEFAULT, + ndsl.util.N_HALO_DEFAULT, extra_dimension_lengths, layout, ) elif request.param == "from_namelist": - sizer = pace.util.SubtileGridSizer.from_namelist(namelist) + sizer = ndsl.util.SubtileGridSizer.from_namelist(namelist) else: raise NotImplementedError() return sizer @@ -103,62 +103,62 @@ def dtype(request): def dim_case(request, nx, ny, nz): if request.param == "x_only": return DimCase( - (pace.util.X_DIM,), - (pace.util.N_HALO_DEFAULT,), + (ndsl.util.X_DIM,), + (ndsl.util.N_HALO_DEFAULT,), (nx,), - (2 * pace.util.N_HALO_DEFAULT + nx + 1,), + (2 * ndsl.util.N_HALO_DEFAULT + nx + 1,), ) elif request.param == "x_interface_only": return DimCase( - (pace.util.X_INTERFACE_DIM,), - (pace.util.N_HALO_DEFAULT,), + (ndsl.util.X_INTERFACE_DIM,), + (ndsl.util.N_HALO_DEFAULT,), (nx + 1,), - (2 * pace.util.N_HALO_DEFAULT + nx + 1,), + (2 * ndsl.util.N_HALO_DEFAULT + nx + 1,), ) elif request.param == "y_only": return DimCase( - (pace.util.Y_DIM,), - (pace.util.N_HALO_DEFAULT,), + (ndsl.util.Y_DIM,), + (ndsl.util.N_HALO_DEFAULT,), (ny,), - (2 * pace.util.N_HALO_DEFAULT + ny + 1,), + (2 * ndsl.util.N_HALO_DEFAULT + ny + 1,), ) elif request.param == "y_interface_only": return DimCase( - (pace.util.Y_INTERFACE_DIM,), - (pace.util.N_HALO_DEFAULT,), + (ndsl.util.Y_INTERFACE_DIM,), + (ndsl.util.N_HALO_DEFAULT,), (ny + 1,), - (2 * pace.util.N_HALO_DEFAULT + ny + 1,), + (2 * ndsl.util.N_HALO_DEFAULT + ny + 1,), ) elif request.param == "z_only": - return DimCase((pace.util.Z_DIM,), (0,), (nz,), (nz + 1,)) + return DimCase((ndsl.util.Z_DIM,), (0,), (nz,), (nz + 1,)) elif request.param == "z_interface_only": - return DimCase((pace.util.Z_INTERFACE_DIM,), (0,), (nz + 1,), (nz + 1,)) + return DimCase((ndsl.util.Z_INTERFACE_DIM,), (0,), (nz + 1,), (nz + 1,)) elif request.param == "x_y": return DimCase( ( - pace.util.X_DIM, - pace.util.Y_DIM, + ndsl.util.X_DIM, + ndsl.util.Y_DIM, ), - (pace.util.N_HALO_DEFAULT, pace.util.N_HALO_DEFAULT), + (ndsl.util.N_HALO_DEFAULT, ndsl.util.N_HALO_DEFAULT), (nx, ny), ( - 2 * pace.util.N_HALO_DEFAULT + nx + 1, - 2 * pace.util.N_HALO_DEFAULT + ny + 1, + 2 * ndsl.util.N_HALO_DEFAULT + nx + 1, + 2 * ndsl.util.N_HALO_DEFAULT + ny + 1, ), ) elif request.param == "z_y_x": return DimCase( ( - pace.util.Z_DIM, - pace.util.Y_DIM, - pace.util.X_DIM, + ndsl.util.Z_DIM, + ndsl.util.Y_DIM, + ndsl.util.X_DIM, ), - (0, pace.util.N_HALO_DEFAULT, pace.util.N_HALO_DEFAULT), + (0, ndsl.util.N_HALO_DEFAULT, ndsl.util.N_HALO_DEFAULT), (nz, ny, nx), ( nz + 1, - 2 * pace.util.N_HALO_DEFAULT + ny + 1, - 2 * pace.util.N_HALO_DEFAULT + nx + 1, + 2 * ndsl.util.N_HALO_DEFAULT + ny + 1, + 2 * ndsl.util.N_HALO_DEFAULT + nx + 1, ), ) @@ -182,7 +182,7 @@ def test_subtile_dimension_sizer_shape(sizer, dim_case): def test_allocator_zeros(numpy, sizer, dim_case, units, dtype): - allocator = pace.util.QuantityFactory(sizer, numpy) + allocator = ndsl.util.QuantityFactory(sizer, numpy) quantity = allocator.zeros(dim_case.dims, units, dtype=dtype) assert quantity.units == units assert quantity.dims == dim_case.dims @@ -193,7 +193,7 @@ def test_allocator_zeros(numpy, sizer, dim_case, units, dtype): def test_allocator_ones(numpy, sizer, dim_case, units, dtype): - allocator = pace.util.QuantityFactory(sizer, numpy) + allocator = ndsl.util.QuantityFactory(sizer, numpy) quantity = allocator.ones(dim_case.dims, units, dtype=dtype) assert quantity.units == units assert quantity.dims == dim_case.dims @@ -204,7 +204,7 @@ def test_allocator_ones(numpy, sizer, dim_case, units, dtype): def test_allocator_empty(numpy, sizer, dim_case, units, dtype): - allocator = pace.util.QuantityFactory(sizer, numpy) + allocator = ndsl.util.QuantityFactory(sizer, numpy) quantity = allocator.empty(dim_case.dims, units, dtype=dtype) assert quantity.units == units assert quantity.dims == dim_case.dims diff --git a/util/tests/test_g2g_communication.py b/ndsl/tests/test_g2g_communication.py similarity index 86% rename from util/tests/test_g2g_communication.py rename to ndsl/tests/test_g2g_communication.py index 3bdf48a1..9eddd284 100644 --- a/util/tests/test_g2g_communication.py +++ b/ndsl/tests/test_g2g_communication.py @@ -8,7 +8,7 @@ import numpy as np import pytest -import pace.util +import ndsl.util try: @@ -37,12 +37,12 @@ def total_ranks(ranks_per_tile): @pytest.fixture def tile_partitioner(layout): - return pace.util.TilePartitioner(layout) + return ndsl.util.TilePartitioner(layout) @pytest.fixture def cube_partitioner(tile_partitioner): - return pace.util.CubedSpherePartitioner(tile_partitioner) + return ndsl.util.CubedSpherePartitioner(tile_partitioner) @pytest.fixture @@ -51,13 +51,13 @@ def cpu_communicators(cube_partitioner): return_list = [] for rank in range(cube_partitioner.total_ranks): return_list.append( - pace.util.CubedSphereCommunicator( - comm=pace.util.testing.DummyComm( + ndsl.util.CubedSphereCommunicator( + comm=ndsl.util.testing.DummyComm( rank=rank, total_ranks=total_ranks, buffer_dict=shared_buffer ), force_cpu=True, partitioner=cube_partitioner, - timer=pace.util.Timer(), + timer=ndsl.util.Timer(), ) ) return return_list @@ -69,13 +69,13 @@ def gpu_communicators(cube_partitioner): return_list = [] for rank in range(cube_partitioner.total_ranks): return_list.append( - pace.util.CubedSphereCommunicator( - comm=pace.util.testing.DummyComm( + ndsl.util.CubedSphereCommunicator( + comm=ndsl.util.testing.DummyComm( rank=rank, total_ranks=total_ranks, buffer_dict=shared_buffer ), partitioner=cube_partitioner, force_cpu=False, - timer=pace.util.Timer(), + timer=ndsl.util.Timer(), ) ) return return_list @@ -115,9 +115,9 @@ def wrapped(*args, **kwargs): def test_halo_update_only_communicate_on_gpu(backend, gpu_communicators): with module_count_calls_to_zeros(np), module_count_calls_to_zeros(cp): shape = (10, 10, 79) - dims = (pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM) + dims = (ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM) data = cp.ones(shape, dtype=float) - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( data, dims=dims, units="m", @@ -143,12 +143,12 @@ def test_halo_update_communicate_though_cpu(backend, cpu_communicators): with module_count_calls_to_zeros(np), module_count_calls_to_zeros(cp): shape = (10, 10, 79) data = cp.ones(shape, dtype=float) - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( data, dims=( - pace.util.X_DIM, - pace.util.Y_DIM, - pace.util.Z_DIM, + ndsl.util.X_DIM, + ndsl.util.Y_DIM, + ndsl.util.Z_DIM, ), units="m", origin=(3, 3, 0), diff --git a/util/tests/test_get_tile_number.py b/ndsl/tests/test_get_tile_number.py similarity index 93% rename from util/tests/test_get_tile_number.py rename to ndsl/tests/test_get_tile_number.py index 5ba606aa..2e0140b1 100644 --- a/util/tests/test_get_tile_number.py +++ b/ndsl/tests/test_get_tile_number.py @@ -1,6 +1,6 @@ import pytest -from pace.util import get_tile_number +from ndsl.util import get_tile_number @pytest.mark.cpu_only diff --git a/util/tests/test_halo_data_transformer.py b/ndsl/tests/test_halo_data_transformer.py similarity index 98% rename from util/tests/test_halo_data_transformer.py rename to ndsl/tests/test_halo_data_transformer.py index 5f4947ab..a5b32c14 100644 --- a/util/tests/test_halo_data_transformer.py +++ b/ndsl/tests/test_halo_data_transformer.py @@ -4,7 +4,7 @@ import numpy as np import pytest -from pace.util import ( +from ndsl.util import ( EAST, NORTH, NORTHEAST, @@ -22,10 +22,10 @@ Quantity, _boundary_utils, ) -from pace.util.buffer import Buffer -from pace.util.halo_data_transformer import HaloDataTransformer, HaloExchangeSpec -from pace.util.quantity import QuantityHaloSpec -from pace.util.rotate import rotate_scalar_data, rotate_vector_data +from ndsl.util.buffer import Buffer +from ndsl.util.halo_data_transformer import HaloDataTransformer, HaloExchangeSpec +from ndsl.util.quantity import QuantityHaloSpec +from ndsl.util.rotate import rotate_scalar_data, rotate_vector_data @pytest.fixture diff --git a/util/tests/test_halo_update.py b/ndsl/tests/test_halo_update.py similarity index 84% rename from util/tests/test_halo_update.py rename to ndsl/tests/test_halo_update.py index 609a046c..d5645ef0 100644 --- a/util/tests/test_halo_update.py +++ b/ndsl/tests/test_halo_update.py @@ -3,8 +3,8 @@ import pytest -import pace.util -from pace.util.buffer import BUFFER_CACHE +import ndsl.util +from ndsl.util.buffer import BUFFER_CACHE @pytest.fixture @@ -61,26 +61,26 @@ def n_points_update(request, n_points, fast): @pytest.fixture( params=[ - pytest.param((pace.util.Y_DIM, pace.util.X_DIM), id="center"), + pytest.param((ndsl.util.Y_DIM, ndsl.util.X_DIM), id="center"), pytest.param( - (pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM), id="center_3d" + (ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM), id="center_3d" ), pytest.param( - (pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM), id="center_3d_reverse", ), pytest.param( - (pace.util.X_DIM, pace.util.Z_DIM, pace.util.Y_DIM), + (ndsl.util.X_DIM, ndsl.util.Z_DIM, ndsl.util.Y_DIM), id="center_3d_shuffle", ), pytest.param( - (pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM), id="interface" + (ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM), id="interface" ), pytest.param( ( - pace.util.Z_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, - pace.util.X_INTERFACE_DIM, + ndsl.util.Z_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, ), id="interface_3d", ), @@ -88,11 +88,11 @@ def n_points_update(request, n_points, fast): ) def dims(request, fast): if fast and request.param in ( - (pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM), + (ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM), ( - pace.util.Z_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, - pace.util.X_INTERFACE_DIM, + ndsl.util.Z_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, ), ): pytest.skip("running in fast mode") @@ -128,12 +128,12 @@ def n_buffer(request): def shape(nz, ny, nx, dims, n_points, n_buffer): return_list = [] length_dict = { - pace.util.X_DIM: 2 * n_points + nx + n_buffer, - pace.util.X_INTERFACE_DIM: 2 * n_points + nx + 1 + n_buffer, - pace.util.Y_DIM: 2 * n_points + ny + n_buffer, - pace.util.Y_INTERFACE_DIM: 2 * n_points + ny + 1 + n_buffer, - pace.util.Z_DIM: nz + n_buffer, - pace.util.Z_INTERFACE_DIM: nz + 1 + n_buffer, + ndsl.util.X_DIM: 2 * n_points + nx + n_buffer, + ndsl.util.X_INTERFACE_DIM: 2 * n_points + nx + 1 + n_buffer, + ndsl.util.Y_DIM: 2 * n_points + ny + n_buffer, + ndsl.util.Y_INTERFACE_DIM: 2 * n_points + ny + 1 + n_buffer, + ndsl.util.Z_DIM: nz + n_buffer, + ndsl.util.Z_INTERFACE_DIM: nz + 1 + n_buffer, } for dim in dims: return_list.append(length_dict[dim]) @@ -144,12 +144,12 @@ def shape(nz, ny, nx, dims, n_points, n_buffer): def origin(n_points, dims, n_buffer): return_list = [] origin_dict = { - pace.util.X_DIM: n_points + n_buffer, - pace.util.X_INTERFACE_DIM: n_points + n_buffer, - pace.util.Y_DIM: n_points + n_buffer, - pace.util.Y_INTERFACE_DIM: n_points + n_buffer, - pace.util.Z_DIM: n_buffer, - pace.util.Z_INTERFACE_DIM: n_buffer, + ndsl.util.X_DIM: n_points + n_buffer, + ndsl.util.X_INTERFACE_DIM: n_points + n_buffer, + ndsl.util.Y_DIM: n_points + n_buffer, + ndsl.util.Y_INTERFACE_DIM: n_points + n_buffer, + ndsl.util.Z_DIM: n_buffer, + ndsl.util.Z_INTERFACE_DIM: n_buffer, } for dim in dims: return_list.append(origin_dict[dim]) @@ -160,12 +160,12 @@ def origin(n_points, dims, n_buffer): def extent(n_points, dims, nz, ny, nx): return_list = [] extent_dict = { - pace.util.X_DIM: nx, - pace.util.X_INTERFACE_DIM: nx + 1, - pace.util.Y_DIM: ny, - pace.util.Y_INTERFACE_DIM: ny + 1, - pace.util.Z_DIM: nz, - pace.util.Z_INTERFACE_DIM: nz + 1, + ndsl.util.X_DIM: nx, + ndsl.util.X_INTERFACE_DIM: nx + 1, + ndsl.util.Y_DIM: ny, + ndsl.util.Y_INTERFACE_DIM: ny + 1, + ndsl.util.Z_DIM: nz, + ndsl.util.Z_INTERFACE_DIM: nz + 1, } for dim in dims: return_list.append(extent_dict[dim]) @@ -173,18 +173,18 @@ def extent(n_points, dims, nz, ny, nx): @pytest.fixture -def communicator_list(cube_partitioner: pace.util.CubedSpherePartitioner): +def communicator_list(cube_partitioner: ndsl.util.CubedSpherePartitioner): total_ranks = cube_partitioner.total_ranks shared_buffer: Dict[str, Any] = {} return_list = [] for rank in range(total_ranks): return_list.append( - pace.util.CubedSphereCommunicator( - comm=pace.util.testing.DummyComm( + ndsl.util.CubedSphereCommunicator( + comm=ndsl.util.testing.DummyComm( rank=rank, total_ranks=total_ranks, buffer_dict=shared_buffer ), partitioner=cube_partitioner, - timer=pace.util.Timer(), + timer=ndsl.util.Timer(), ) ) return return_list @@ -197,12 +197,12 @@ def tile_communicator_list(tile_partitioner): return_list = [] for rank in range(total_ranks): return_list.append( - pace.util.TileCommunicator( - comm=pace.util.testing.DummyComm( + ndsl.util.TileCommunicator( + comm=ndsl.util.testing.DummyComm( rank=rank, total_ranks=total_ranks, buffer_dict=shared_buffer ), partitioner=tile_partitioner, - timer=pace.util.Timer(), + timer=ndsl.util.Timer(), ) ) return return_list @@ -210,12 +210,12 @@ def tile_communicator_list(tile_partitioner): @pytest.fixture def tile_partitioner(layout): - return pace.util.TilePartitioner(layout) + return ndsl.util.TilePartitioner(layout) @pytest.fixture def cube_partitioner(tile_partitioner): - return pace.util.CubedSpherePartitioner(tile_partitioner) + return ndsl.util.CubedSpherePartitioner(tile_partitioner) @pytest.fixture @@ -223,16 +223,16 @@ def updated_slice(ny, nx, dims, n_points, n_points_update): n_points_remain = n_points - n_points_update return_list = [] length_dict = { - pace.util.X_DIM: slice(n_points_remain, n_points + nx + n_points_update), - pace.util.X_INTERFACE_DIM: slice( + ndsl.util.X_DIM: slice(n_points_remain, n_points + nx + n_points_update), + ndsl.util.X_INTERFACE_DIM: slice( n_points_remain, n_points + nx + 1 + n_points_update ), - pace.util.Y_DIM: slice(n_points_remain, n_points + ny + n_points_update), - pace.util.Y_INTERFACE_DIM: slice( + ndsl.util.Y_DIM: slice(n_points_remain, n_points + ny + n_points_update), + ndsl.util.Y_INTERFACE_DIM: slice( n_points_remain, n_points + ny + 1 + n_points_update ), - pace.util.Z_DIM: slice(None, None), - pace.util.Z_INTERFACE_DIM: slice(None, None), + ndsl.util.Z_DIM: slice(None, None), + ndsl.util.Z_INTERFACE_DIM: slice(None, None), } for dim in dims: return_list.append(length_dict[dim]) @@ -248,33 +248,33 @@ def remaining_ones(nz, ny, nx, n_points, n_points_update): @pytest.fixture def boundary_dict(ranks_per_tile): if ranks_per_tile == 1: - return {0: pace.util.EDGE_BOUNDARY_TYPES} + return {0: ndsl.util.EDGE_BOUNDARY_TYPES} elif ranks_per_tile == 4: return { - 0: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHWEST, pace.util.NORTHEAST, pace.util.SOUTHEAST), - 1: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHWEST, pace.util.NORTHEAST, pace.util.SOUTHWEST), - 2: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHEAST, pace.util.SOUTHWEST, pace.util.SOUTHEAST), - 3: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHWEST, pace.util.SOUTHWEST, pace.util.SOUTHEAST), + 0: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHWEST, ndsl.util.NORTHEAST, ndsl.util.SOUTHEAST), + 1: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHWEST, ndsl.util.NORTHEAST, ndsl.util.SOUTHWEST), + 2: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHEAST, ndsl.util.SOUTHWEST, ndsl.util.SOUTHEAST), + 3: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHWEST, ndsl.util.SOUTHWEST, ndsl.util.SOUTHEAST), } elif ranks_per_tile == 9: return { - 0: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHWEST, pace.util.NORTHEAST, pace.util.SOUTHEAST), - 1: pace.util.BOUNDARY_TYPES, - 2: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHWEST, pace.util.NORTHEAST, pace.util.SOUTHWEST), - 3: pace.util.BOUNDARY_TYPES, - 4: pace.util.BOUNDARY_TYPES, - 5: pace.util.BOUNDARY_TYPES, - 6: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHEAST, pace.util.SOUTHWEST, pace.util.SOUTHEAST), - 7: pace.util.BOUNDARY_TYPES, - 8: pace.util.EDGE_BOUNDARY_TYPES - + (pace.util.NORTHWEST, pace.util.SOUTHWEST, pace.util.SOUTHEAST), + 0: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHWEST, ndsl.util.NORTHEAST, ndsl.util.SOUTHEAST), + 1: ndsl.util.BOUNDARY_TYPES, + 2: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHWEST, ndsl.util.NORTHEAST, ndsl.util.SOUTHWEST), + 3: ndsl.util.BOUNDARY_TYPES, + 4: ndsl.util.BOUNDARY_TYPES, + 5: ndsl.util.BOUNDARY_TYPES, + 6: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHEAST, ndsl.util.SOUTHWEST, ndsl.util.SOUTHEAST), + 7: ndsl.util.BOUNDARY_TYPES, + 8: ndsl.util.EDGE_BOUNDARY_TYPES + + (ndsl.util.NORTHWEST, ndsl.util.SOUTHWEST, ndsl.util.SOUTHEAST), } else: raise NotImplementedError(ranks_per_tile) @@ -292,7 +292,7 @@ def depth_quantity_list( data[:] = numpy.nan for n_inside in range(max(n_points, max(extent) // 2), -1, -1): for i, dim in enumerate(dims): - if (n_inside <= extent[i] // 2) and (dim in pace.util.HORIZONTAL_DIMS): + if (n_inside <= extent[i] // 2) and (dim in ndsl.util.HORIZONTAL_DIMS): pos = [slice(None, None)] * len(dims) pos[i] = origin[i] + n_inside data[tuple(pos)] = n_inside @@ -300,13 +300,13 @@ def depth_quantity_list( data[tuple(pos)] = n_inside for n_outside in range(1, n_points + 1): for i, dim in enumerate(dims): - if dim in pace.util.HORIZONTAL_DIMS: + if dim in ndsl.util.HORIZONTAL_DIMS: pos = [slice(None, None)] * len(dims) pos[i] = origin[i] - n_outside data[tuple(pos)] = numpy.nan pos[i] = origin[i] + extent[i] + n_outside - 1 data[tuple(pos)] = numpy.nan - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( data, dims=dims, units=units, @@ -329,7 +329,7 @@ def tile_depth_quantity_list( data[:] = numpy.nan for n_inside in range(max(n_points, max(extent) // 2), -1, -1): for i, dim in enumerate(dims): - if (n_inside <= extent[i] // 2) and (dim in pace.util.HORIZONTAL_DIMS): + if (n_inside <= extent[i] // 2) and (dim in ndsl.util.HORIZONTAL_DIMS): pos = [slice(None, None)] * len(dims) pos[i] = origin[i] + n_inside data[tuple(pos)] = n_inside @@ -337,13 +337,13 @@ def tile_depth_quantity_list( data[tuple(pos)] = n_inside for n_outside in range(1, n_points + 1): for i, dim in enumerate(dims): - if dim in pace.util.HORIZONTAL_DIMS: + if dim in ndsl.util.HORIZONTAL_DIMS: pos = [slice(None, None)] * len(dims) pos[i] = origin[i] - n_outside data[tuple(pos)] = numpy.nan pos[i] = origin[i] + extent[i] + n_outside - 1 data[tuple(pos)] = numpy.nan - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( data, dims=dims, units=units, @@ -356,7 +356,7 @@ def tile_depth_quantity_list( @pytest.mark.parametrize( "layout, n_points, n_points_update, dims", - [[(1, 1), 3, "same", [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM]]], + [[(1, 1), 3, "same", [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM]]], indirect=True, ) def test_halo_update_timer( @@ -388,7 +388,7 @@ def test_halo_update_timer( ) for communicator in communicator_list: with subtests.test(rank=communicator.rank): - assert isinstance(communicator.timer, pace.util.Timer) + assert isinstance(communicator.timer, ndsl.util.Timer) times = communicator.timer.times missing_keys = set(required_times_keys).difference(times.keys()) assert len(missing_keys) == 0 @@ -487,7 +487,7 @@ def zeros_quantity_list(total_ranks, dims, units, origin, extent, shape, numpy, return_list = [] for rank in range(total_ranks): data = numpy.ones(shape, dtype=dtype) - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( data, dims=dims, units=units, @@ -508,7 +508,7 @@ def zeros_quantity_tile_list( return_list = [] for rank in range(single_tile_ranks): data = numpy.ones(shape, dtype=dtype) - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( data, dims=dims, units=units, @@ -532,7 +532,7 @@ def test_too_many_points_requested( test that an exception is raised when trying to update more halo points than exist """ for communicator, quantity in zip(communicator_list, zeros_quantity_list): - with pytest.raises(pace.util.OutOfBoundsError): + with pytest.raises(ndsl.util.OutOfBoundsError): communicator.start_halo_update(quantity, n_points_update) @@ -550,7 +550,7 @@ def test_too_many_points_requested_tile( on a tile """ for communicator, quantity in zip(tile_communicator_list, zeros_quantity_tile_list): - with pytest.raises(pace.util.OutOfBoundsError): + with pytest.raises(ndsl.util.OutOfBoundsError): communicator.start_halo_update(quantity, n_points_update) @@ -575,7 +575,7 @@ def test_zeros_halo_update( for rank, quantity in enumerate(zeros_quantity_list): boundaries = boundary_dict[rank % ranks_per_tile] for boundary in boundaries: - boundary_slice = pace.util._boundary_utils.get_boundary_slice( + boundary_slice = ndsl.util._boundary_utils.get_boundary_slice( quantity.dims, quantity.origin, quantity.extent, @@ -598,8 +598,8 @@ def test_zeros_halo_update( @pytest.mark.parametrize( "layout, n_points, n_points_update, dims", [ - [(1, 1), 3, "same", [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM]], - [(2, 2), 3, "same", [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM]], + [(1, 1), 3, "same", [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM]], + [(2, 2), 3, "same", [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM]], ], indirect=True, ) @@ -645,7 +645,7 @@ def test_zeros_tile_halo_update( rank % ranks_per_tile ] # Is the %ranks_per_tile necessary? for boundary in boundaries: - boundary_slice = pace.util._boundary_utils.get_boundary_slice( + boundary_slice = ndsl.util._boundary_utils.get_boundary_slice( quantity.dims, quantity.origin, quantity.extent, @@ -693,7 +693,7 @@ def test_zeros_vector_halo_update( for rank, (y_quantity, x_quantity) in enumerate(zip(y_list, x_list)): boundaries = boundary_dict[rank % ranks_per_tile] for boundary in boundaries: - boundary_slice = pace.util._boundary_utils.get_boundary_slice( + boundary_slice = ndsl.util._boundary_utils.get_boundary_slice( x_quantity.dims, x_quantity.origin, x_quantity.extent, @@ -744,7 +744,7 @@ def test_zeros_vector_tile_halo_update( for rank, (y_quantity, x_quantity) in enumerate(zip(y_list, x_list)): boundaries = boundary_dict[rank % ranks_per_tile] for boundary in boundaries: - boundary_slice = pace.util._boundary_utils.get_boundary_slice( + boundary_slice = ndsl.util._boundary_utils.get_boundary_slice( x_quantity.dims, x_quantity.origin, x_quantity.extent, @@ -767,7 +767,7 @@ def test_zeros_vector_tile_halo_update( @pytest.mark.parametrize( "layout, n_points, n_points_update, dims", - [[(1, 1), 3, "same", [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM]]], + [[(1, 1), 3, "same", [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM]]], indirect=True, ) def test_vector_halo_update_timer( @@ -804,7 +804,7 @@ def test_vector_halo_update_timer( ) for communicator in communicator_list: with subtests.test(rank=communicator.rank): - assert isinstance(communicator.timer, pace.util.Timer) + assert isinstance(communicator.timer, ndsl.util.Timer) times = communicator.timer.times missing_keys = set(required_times_keys).difference(times.keys()) assert len(missing_keys) == 0 @@ -816,13 +816,13 @@ def test_vector_halo_update_timer( def get_horizontal_dims(dims): - for dim in pace.util.X_DIMS: + for dim in ndsl.util.X_DIMS: if dim in dims: x_dim = dim break else: raise ValueError(f"no x dimension in {dims}") - for dim in pace.util.Y_DIMS: + for dim in ndsl.util.Y_DIMS: if dim in dims: y_dim = dim break @@ -853,7 +853,7 @@ def test_halo_updater_stability( BUFFER_CACHE.clear() halo_updaters = [] for communicator, quantity in zip(communicator_list, zeros_quantity_list): - specification = pace.util.QuantityHaloSpec( + specification = ndsl.util.QuantityHaloSpec( n_points, quantity.data.strides, quantity.data.itemsize, @@ -864,7 +864,7 @@ def test_halo_updater_stability( quantity.np, quantity.metadata.dtype, ) - halo_updater = pace.util.HaloUpdater.from_scalar_specifications( + halo_updater = ndsl.util.HaloUpdater.from_scalar_specifications( comm=communicator, numpy_like_module=quantity.np, specifications=[specification], diff --git a/util/tests/test_halo_update_ranks.py b/ndsl/tests/test_halo_update_ranks.py similarity index 74% rename from util/tests/test_halo_update_ranks.py rename to ndsl/tests/test_halo_update_ranks.py index 427f952d..7a259890 100644 --- a/util/tests/test_halo_update_ranks.py +++ b/ndsl/tests/test_halo_update_ranks.py @@ -1,6 +1,6 @@ import pytest -import pace.util +import ndsl.util @pytest.fixture @@ -27,12 +27,12 @@ def total_ranks(ranks_per_tile): def shape(nz, ny, nx, dims, n_points): return_list = [] length_dict = { - pace.util.X_DIM: 2 * n_points + nx, - pace.util.X_INTERFACE_DIM: 2 * n_points + nx + 1, - pace.util.Y_DIM: 2 * n_points + ny, - pace.util.Y_INTERFACE_DIM: 2 * n_points + ny + 1, - pace.util.Z_DIM: nz, - pace.util.Z_INTERFACE_DIM: nz + 1, + ndsl.util.X_DIM: 2 * n_points + nx, + ndsl.util.X_INTERFACE_DIM: 2 * n_points + nx + 1, + ndsl.util.Y_DIM: 2 * n_points + ny, + ndsl.util.Y_INTERFACE_DIM: 2 * n_points + ny + 1, + ndsl.util.Z_DIM: nz, + ndsl.util.Z_INTERFACE_DIM: nz + 1, } for dim in dims: return_list.append(length_dict[dim]) @@ -43,12 +43,12 @@ def shape(nz, ny, nx, dims, n_points): def origin(n_points, dims): return_list = [] origin_dict = { - pace.util.X_DIM: n_points, - pace.util.X_INTERFACE_DIM: n_points, - pace.util.Y_DIM: n_points, - pace.util.Y_INTERFACE_DIM: n_points, - pace.util.Z_DIM: 0, - pace.util.Z_INTERFACE_DIM: 0, + ndsl.util.X_DIM: n_points, + ndsl.util.X_INTERFACE_DIM: n_points, + ndsl.util.Y_DIM: n_points, + ndsl.util.Y_INTERFACE_DIM: n_points, + ndsl.util.Z_DIM: 0, + ndsl.util.Z_INTERFACE_DIM: 0, } for dim in dims: return_list.append(origin_dict[dim]) @@ -59,12 +59,12 @@ def origin(n_points, dims): def extent(n_points, dims, nz, ny, nx): return_list = [] extent_dict = { - pace.util.X_DIM: nx, - pace.util.X_INTERFACE_DIM: nx + 1, - pace.util.Y_DIM: ny, - pace.util.Y_INTERFACE_DIM: ny + 1, - pace.util.Z_DIM: nz, - pace.util.Z_INTERFACE_DIM: nz + 1, + ndsl.util.X_DIM: nx, + ndsl.util.X_INTERFACE_DIM: nx + 1, + ndsl.util.Y_DIM: ny, + ndsl.util.Y_INTERFACE_DIM: ny + 1, + ndsl.util.Z_DIM: nz, + ndsl.util.Z_INTERFACE_DIM: nz + 1, } for dim in dims: return_list.append(extent_dict[dim]) @@ -73,12 +73,12 @@ def extent(n_points, dims, nz, ny, nx): @pytest.fixture def tile_partitioner(layout): - return pace.util.TilePartitioner(layout) + return ndsl.util.TilePartitioner(layout) @pytest.fixture def cube_partitioner(tile_partitioner): - return pace.util.CubedSpherePartitioner(tile_partitioner) + return ndsl.util.CubedSpherePartitioner(tile_partitioner) @pytest.fixture() @@ -87,12 +87,12 @@ def communicator_list(cube_partitioner, total_ranks): return_list = [] for rank in range(cube_partitioner.total_ranks): return_list.append( - pace.util.CubedSphereCommunicator( - comm=pace.util.testing.DummyComm( + ndsl.util.CubedSphereCommunicator( + comm=ndsl.util.testing.DummyComm( rank=rank, total_ranks=total_ranks, buffer_dict=shared_buffer ), partitioner=cube_partitioner, - timer=pace.util.Timer(), + timer=ndsl.util.Timer(), ) ) return return_list @@ -105,9 +105,9 @@ def rank_quantity_list(total_ranks, numpy, dtype): data = numpy.empty((3, 3), dtype=dtype) data[:] = numpy.nan data[1, 1] = rank - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( data, - dims=(pace.util.Y_DIM, pace.util.X_DIM), + dims=(ndsl.util.Y_DIM, ndsl.util.X_DIM), units="m", origin=(1, 1), extent=(1, 1), diff --git a/util/tests/test_legacy_restart.py b/ndsl/tests/test_legacy_restart.py similarity index 83% rename from util/tests/test_legacy_restart.py rename to ndsl/tests/test_legacy_restart.py index 94d33a27..24da8632 100644 --- a/util/tests/test_legacy_restart.py +++ b/ndsl/tests/test_legacy_restart.py @@ -11,9 +11,9 @@ import numpy as np import pytest -import pace.util -import pace.util._legacy_restart -from pace.util.testing import DummyComm +import ndsl.util +import ndsl.util._legacy_restart +from ndsl.util.testing import DummyComm requires_xarray = pytest.mark.skipif(xr is None, reason="xarray is not installed") @@ -33,15 +33,15 @@ def get_c12_restart_state_list(layout, only_names, tracer_properties): shared_buffer = {} communicator_list = [] for rank in range(total_ranks): - communicator = pace.util.CubedSphereCommunicator( + communicator = ndsl.util.CubedSphereCommunicator( DummyComm(rank, total_ranks, shared_buffer), - pace.util.CubedSpherePartitioner(pace.util.TilePartitioner(layout)), + ndsl.util.CubedSpherePartitioner(ndsl.util.TilePartitioner(layout)), ) communicator_list.append(communicator) state_list = [] for communicator in communicator_list: state_list.append( - pace.util.open_restart( + ndsl.util.open_restart( os.path.join(DATA_DIRECTORY, "c12_restart"), communicator, only_names=only_names, @@ -70,16 +70,16 @@ def test_open_c12_restart(layout): if name == "time": assert isinstance(value, cftime.DatetimeJulian) else: - assert isinstance(value, pace.util.Quantity) + assert isinstance(value, ndsl.util.Quantity) assert np.sum(np.isnan(value.view[:])) == 0 for dim, extent in zip(value.dims, value.extent): - if dim == pace.util.X_DIM: + if dim == ndsl.util.X_DIM: assert extent == nx - elif dim == pace.util.X_INTERFACE_DIM: + elif dim == ndsl.util.X_INTERFACE_DIM: assert extent == nx + 1 - elif dim == pace.util.Y_DIM: + elif dim == ndsl.util.Y_DIM: assert extent == ny - elif dim == pace.util.Y_INTERFACE_DIM: + elif dim == ndsl.util.Y_INTERFACE_DIM: assert extent == ny + 1 @@ -88,33 +88,33 @@ def test_open_c12_restart(layout): [ { "specific_humidity": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "units": "kg/kg", "restart_name": "sphum", }, }, { "specific_humidity_by_another_name": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "units": "kg/kg", "restart_name": "sphum", }, }, { "specific_humidity": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "units": "kg/kg", "restart_name": "sphum", }, }, { "specific_humidity": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "units": "kg/kg", "restart_name": "sphum", }, "snow_water_mixing_ratio": { - "dims": [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + "dims": [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], "units": "kg/kg", "restart_name": "snowwat", }, @@ -146,15 +146,15 @@ def test_open_c12_restart_empty_to_state_without_crashing(layout): shared_buffer = {} communicator_list = [] for rank in range(total_ranks): - communicator = pace.util.CubedSphereCommunicator( + communicator = ndsl.util.CubedSphereCommunicator( DummyComm(rank, total_ranks, shared_buffer), - pace.util.CubedSpherePartitioner(pace.util.TilePartitioner(layout)), + ndsl.util.CubedSpherePartitioner(ndsl.util.TilePartitioner(layout)), ) communicator_list.append(communicator) state_list = [] for communicator in communicator_list: state_list.append({}) - pace.util.open_restart( + ndsl.util.open_restart( os.path.join(DATA_DIRECTORY, "c12_restart"), communicator, to_state=state_list[-1], @@ -166,16 +166,16 @@ def test_open_c12_restart_empty_to_state_without_crashing(layout): if name == "time": assert isinstance(value, cftime.DatetimeJulian) else: - assert isinstance(value, pace.util.Quantity) + assert isinstance(value, ndsl.util.Quantity) assert np.sum(np.isnan(value.view[:])) == 0 for dim, extent in zip(value.dims, value.extent): - if dim == pace.util.X_DIM: + if dim == ndsl.util.X_DIM: assert extent == nx - elif dim == pace.util.X_INTERFACE_DIM: + elif dim == ndsl.util.X_INTERFACE_DIM: assert extent == nx + 1 - elif dim == pace.util.Y_DIM: + elif dim == ndsl.util.Y_DIM: assert extent == ny - elif dim == pace.util.Y_INTERFACE_DIM: + elif dim == ndsl.util.Y_INTERFACE_DIM: assert extent == ny + 1 @@ -189,15 +189,15 @@ def test_open_c12_restart_to_allocated_state_without_crashing(layout): shared_buffer = {} communicator_list = [] for rank in range(total_ranks): - communicator = pace.util.CubedSphereCommunicator( + communicator = ndsl.util.CubedSphereCommunicator( DummyComm(rank, total_ranks, shared_buffer), - pace.util.CubedSpherePartitioner(pace.util.TilePartitioner(layout)), + ndsl.util.CubedSpherePartitioner(ndsl.util.TilePartitioner(layout)), ) communicator_list.append(communicator) state_list = [] for communicator in communicator_list: state_list.append( - pace.util.open_restart( + ndsl.util.open_restart( os.path.join(DATA_DIRECTORY, "c12_restart"), communicator ) ) @@ -206,7 +206,7 @@ def test_open_c12_restart_to_allocated_state_without_crashing(layout): if name != "time": value.view[:] = np.nan for state, communicator in zip(state_list, communicator_list): - pace.util.open_restart( + ndsl.util.open_restart( os.path.join(DATA_DIRECTORY, "c12_restart"), communicator, to_state=state ) @@ -217,16 +217,16 @@ def test_open_c12_restart_to_allocated_state_without_crashing(layout): if name == "time": assert isinstance(value, cftime.DatetimeJulian) else: - assert isinstance(value, pace.util.Quantity) + assert isinstance(value, ndsl.util.Quantity) assert np.sum(np.isnan(value.view[:])) == 0 for dim, extent in zip(value.dims, value.extent): - if dim == pace.util.X_DIM: + if dim == ndsl.util.X_DIM: assert extent == nx - elif dim == pace.util.X_INTERFACE_DIM: + elif dim == ndsl.util.X_INTERFACE_DIM: assert extent == nx + 1 - elif dim == pace.util.Y_DIM: + elif dim == ndsl.util.Y_DIM: assert extent == ny - elif dim == pace.util.Y_INTERFACE_DIM: + elif dim == ndsl.util.Y_INTERFACE_DIM: assert extent == ny + 1 @@ -250,7 +250,7 @@ def coupler_res_file_and_time(request): def test_get_current_date_from_coupler_res(coupler_res_file_and_time): filename, current_time = coupler_res_file_and_time with open(filename, "r") as f: - result = pace.util.io.get_current_date_from_coupler_res(f) + result = ndsl.util.io.get_current_date_from_coupler_res(f) assert result == current_time @@ -280,7 +280,7 @@ def result_dims(data_array, new_dims): @pytest.mark.cpu_only @requires_xarray def test_apply_dims(data_array, new_dims, result_dims): - result = pace.util._legacy_restart._apply_dims(data_array, new_dims) + result = ndsl.util._legacy_restart._apply_dims(data_array, new_dims) np.testing.assert_array_equal(result.values, data_array.values) assert result.dims == result_dims assert result.attrs == data_array.attrs @@ -323,7 +323,7 @@ def test_apply_dims(data_array, new_dims, result_dims): ) @pytest.mark.cpu_only def test_map_keys(old_dict, key_mapping, new_dict): - result = pace.util._legacy_restart.map_keys(old_dict, key_mapping) + result = ndsl.util._legacy_restart.map_keys(old_dict, key_mapping) assert result == new_dict @@ -358,7 +358,7 @@ def test_map_keys(old_dict, key_mapping, new_dict): ) @pytest.mark.cpu_only def test_get_rank_suffix(rank, total_ranks, suffix): - result = pace.util._legacy_restart.get_rank_suffix(rank, total_ranks) + result = ndsl.util._legacy_restart.get_rank_suffix(rank, total_ranks) assert result == suffix @@ -367,7 +367,7 @@ def test_get_rank_suffix(rank, total_ranks, suffix): def test_get_rank_suffix_invalid_total_ranks(invalid_total_ranks): with pytest.raises(ValueError): # total_ranks should be multiple of 6 - pace.util._legacy_restart.get_rank_suffix(0, invalid_total_ranks) + ndsl.util._legacy_restart.get_rank_suffix(0, invalid_total_ranks) @pytest.mark.cpu_only @@ -377,7 +377,7 @@ def test_read_state_incorrectly_encoded_time(): state_ds = xr.DataArray(0.0, name="time").to_dataset() state_ds.to_netcdf(file.name) with pytest.raises(ValueError, match="Time in stored state"): - pace.util.io.read_state(file.name) + ndsl.util.io.read_state(file.name) @pytest.mark.cpu_only @@ -387,7 +387,7 @@ def test_read_state_non_scalar_time(): state_ds = xr.DataArray([0.0, 1.0], dims=["T"], name="time").to_dataset() state_ds.to_netcdf(file.name) with pytest.raises(ValueError, match="scalar time"): - pace.util.io.read_state(file.name) + ndsl.util.io.read_state(file.name) @pytest.mark.parametrize( diff --git a/util/tests/test_local_comm.py b/ndsl/tests/test_local_comm.py similarity index 97% rename from util/tests/test_local_comm.py rename to ndsl/tests/test_local_comm.py index d8465507..9fe379ee 100644 --- a/util/tests/test_local_comm.py +++ b/ndsl/tests/test_local_comm.py @@ -1,7 +1,7 @@ import numpy import pytest -from pace.util import LocalComm +from ndsl.util import LocalComm @pytest.fixture diff --git a/util/tests/test_netcdf_monitor.py b/ndsl/tests/test_netcdf_monitor.py similarity index 89% rename from util/tests/test_netcdf_monitor.py rename to ndsl/tests/test_netcdf_monitor.py index 31aca983..11379c48 100644 --- a/util/tests/test_netcdf_monitor.py +++ b/ndsl/tests/test_netcdf_monitor.py @@ -6,9 +6,9 @@ import numpy as np import pytest -import pace.util -from pace.util._optional_imports import xarray as xr -from pace.util.testing import DummyComm +import ndsl.util +from ndsl.util._optional_imports import xarray as xr +from ndsl.util.testing import DummyComm requires_xarray = pytest.mark.skipif(xr is None, reason="xarray is not installed") @@ -39,16 +39,16 @@ def test_monitor_store_multi_rank_state( nz, ny, nx = shape ny_rank = int(ny / layout[0] + ny_rank_add) nx_rank = int(nx / layout[1] + nx_rank_add) - tile = pace.util.TilePartitioner(layout) + tile = ndsl.util.TilePartitioner(layout) time = cftime.DatetimeJulian(2010, 6, 20, 6, 0, 0) timestep = timedelta(hours=1) total_ranks = 6 * layout[0] * layout[1] - partitioner = pace.util.CubedSpherePartitioner(tile) + partitioner = ndsl.util.CubedSpherePartitioner(tile) shared_buffer = {} - monitor_list: List[pace.util.NetCDFMonitor] = [] + monitor_list: List[ndsl.util.NetCDFMonitor] = [] for rank in range(total_ranks): - communicator = pace.util.CubedSphereCommunicator( + communicator = ndsl.util.CubedSphereCommunicator( partitioner=partitioner, comm=DummyComm( rank=rank, total_ranks=total_ranks, buffer_dict=shared_buffer @@ -58,7 +58,7 @@ def test_monitor_store_multi_rank_state( # created in ascending order communicator.tile monitor_list.append( - pace.util.NetCDFMonitor( + ndsl.util.NetCDFMonitor( path=tmpdir, communicator=communicator, time_chunk_size=time_chunk_size, @@ -67,7 +67,7 @@ def test_monitor_store_multi_rank_state( for rank in range(total_ranks - 1, -1, -1): state = { - "var_const1": pace.util.Quantity( + "var_const1": ndsl.util.Quantity( numpy.ones([nz, ny_rank, nx_rank]), dims=dims, units=units, @@ -80,7 +80,7 @@ def test_monitor_store_multi_rank_state( for rank in range(total_ranks - 1, -1, -1): state = { "time": time + i_t * timestep, - "var1": pace.util.Quantity( + "var1": ndsl.util.Quantity( numpy.ones([nz, ny_rank, nx_rank]), dims=dims, units=units, @@ -93,7 +93,7 @@ def test_monitor_store_multi_rank_state( for rank in range(total_ranks - 1, -1, -1): state = { - "var_const2": pace.util.Quantity( + "var_const2": ndsl.util.Quantity( numpy.ones([nz, ny_rank, nx_rank]), dims=dims, units=units, diff --git a/util/tests/test_nudging.py b/ndsl/tests/test_nudging.py similarity index 93% rename from util/tests/test_nudging.py rename to ndsl/tests/test_nudging.py index 9e8a443f..a5f45b1d 100644 --- a/util/tests/test_nudging.py +++ b/ndsl/tests/test_nudging.py @@ -3,7 +3,7 @@ import pytest -import pace.util +import ndsl.util @pytest.fixture(params=["empty", "one_var", "two_vars"]) @@ -12,7 +12,7 @@ def state(request, numpy): return {} elif request.param == "one_var": return { - "var1": pace.util.Quantity( + "var1": ndsl.util.Quantity( numpy.ones([5]), dims=["dim1"], units="m", @@ -20,12 +20,12 @@ def state(request, numpy): } elif request.param == "two_vars": return { - "var1": pace.util.Quantity( + "var1": ndsl.util.Quantity( numpy.ones([5]), dims=["dim1"], units="m", ), - "var2": pace.util.Quantity( + "var2": ndsl.util.Quantity( numpy.ones([5]), dims=["dim_2"], units="m", @@ -46,7 +46,7 @@ def reference_state(reference_difference, state, numpy): reference_state = copy.deepcopy(state) elif reference_difference == "extra_var": reference_state = copy.deepcopy(state) - reference_state["extra_var"] = pace.util.Quantity( + reference_state["extra_var"] = ndsl.util.Quantity( numpy.ones([5]), dims=["dim1"], units="m", @@ -126,7 +126,7 @@ def test_apply_nudging_equals( nudging_tendencies, numpy, ): - result = pace.util.apply_nudging( + result = ndsl.util.apply_nudging( state, reference_state, nudging_timescales, timestep ) for name, tendency in nudging_tendencies.items(): @@ -142,7 +142,7 @@ def test_apply_nudging_equals( def test_get_nudging_tendencies_equals( state, reference_state, nudging_timescales, nudging_tendencies, numpy ): - result = pace.util.get_nudging_tendencies( + result = ndsl.util.get_nudging_tendencies( state, reference_state, nudging_timescales ) for name, tendency in nudging_tendencies.items(): @@ -156,7 +156,7 @@ def test_get_nudging_tendencies_half_timescale( ): for name, timescale in nudging_timescales.items(): nudging_timescales[name] = timedelta(seconds=0.5 * timescale.total_seconds()) - result = pace.util.get_nudging_tendencies( + result = ndsl.util.get_nudging_tendencies( state, reference_state, nudging_timescales ) for name, tendency in nudging_tendencies.items(): diff --git a/util/tests/test_null_comm.py b/ndsl/tests/test_null_comm.py similarity index 52% rename from util/tests/test_null_comm.py rename to ndsl/tests/test_null_comm.py index ef2c7f44..f761ca35 100644 --- a/util/tests/test_null_comm.py +++ b/ndsl/tests/test_null_comm.py @@ -1,5 +1,5 @@ -import pace.util -from pace.util.null_comm import NullComm +import ndsl.util +from ndsl.util.null_comm import NullComm def test_can_create_cube_communicator(): @@ -7,6 +7,6 @@ def test_can_create_cube_communicator(): total_ranks = 24 mpi_comm = NullComm(rank, total_ranks) layout = (2, 2) - partitioner = pace.util.CubedSpherePartitioner(pace.util.TilePartitioner(layout)) - communicator = pace.util.CubedSphereCommunicator(mpi_comm, partitioner) + partitioner = ndsl.util.CubedSpherePartitioner(ndsl.util.TilePartitioner(layout)) + communicator = ndsl.util.CubedSphereCommunicator(mpi_comm, partitioner) communicator.tile.partitioner diff --git a/util/tests/test_partitioner.py b/ndsl/tests/test_partitioner.py similarity index 79% rename from util/tests/test_partitioner.py rename to ndsl/tests/test_partitioner.py index bebc3351..2c08ebb8 100644 --- a/util/tests/test_partitioner.py +++ b/ndsl/tests/test_partitioner.py @@ -1,8 +1,8 @@ import numpy as np import pytest -import pace.util -import pace.util.partitioner +import ndsl.util +import ndsl.util.partitioner rank_list = [] @@ -25,7 +25,7 @@ ) @pytest.mark.cpu_only def test_get_tile_number(rank, total_ranks, tile_index): - tile = pace.util.get_tile_number(rank, total_ranks) + tile = ndsl.util.get_tile_number(rank, total_ranks) assert tile == tile_index + 1 @@ -34,7 +34,7 @@ def test_get_tile_number(rank, total_ranks, tile_index): ) @pytest.mark.cpu_only def test_get_tile_index(rank, total_ranks, tile_index): - tile = pace.util.get_tile_index(rank, total_ranks) + tile = ndsl.util.get_tile_index(rank, total_ranks) assert tile == tile_index @@ -63,37 +63,37 @@ def test_get_tile_index(rank, total_ranks, tile_index): ) @pytest.mark.cpu_only def test_subtile_index(rank, layout, subtile_index): - partitioner = pace.util.TilePartitioner(layout) + partitioner = ndsl.util.TilePartitioner(layout) assert partitioner.subtile_index(rank) == subtile_index @pytest.mark.parametrize( "array_extent, array_dims, layout, tile_extent", [ - ((16, 32), (pace.util.Y_DIM, pace.util.X_DIM), (1, 1), (16, 32)), - ((16, 32), (pace.util.Y_DIM, pace.util.X_INTERFACE_DIM), (1, 1), (16, 32)), - ((16, 32), (pace.util.Y_INTERFACE_DIM, pace.util.X_DIM), (1, 1), (16, 32)), + ((16, 32), (ndsl.util.Y_DIM, ndsl.util.X_DIM), (1, 1), (16, 32)), + ((16, 32), (ndsl.util.Y_DIM, ndsl.util.X_INTERFACE_DIM), (1, 1), (16, 32)), + ((16, 32), (ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_DIM), (1, 1), (16, 32)), ( (16, 32), - (pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM), + (ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM), (1, 1), (16, 32), ), ( (8, 16, 32), - (pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM), + (ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM), (1, 1), (8, 16, 32), ), - ((2, 2), (pace.util.Y_DIM, pace.util.X_DIM), (2, 2), (4, 4)), - ((3, 2), (pace.util.Y_INTERFACE_DIM, pace.util.X_DIM), (2, 2), (5, 4)), - ((2, 3), (pace.util.Y_DIM, pace.util.X_INTERFACE_DIM), (2, 2), (4, 5)), + ((2, 2), (ndsl.util.Y_DIM, ndsl.util.X_DIM), (2, 2), (4, 4)), + ((3, 2), (ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_DIM), (2, 2), (5, 4)), + ((2, 3), (ndsl.util.Y_DIM, ndsl.util.X_INTERFACE_DIM), (2, 2), (4, 5)), ( (4, 2, 3), ( - pace.util.Z_INTERFACE_DIM, - pace.util.Y_DIM, - pace.util.X_INTERFACE_DIM, + ndsl.util.Z_INTERFACE_DIM, + ndsl.util.Y_DIM, + ndsl.util.X_INTERFACE_DIM, ), (2, 2), (4, 4, 5), @@ -102,7 +102,7 @@ def test_subtile_index(rank, layout, subtile_index): ) @pytest.mark.cpu_only def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_extent): - result = pace.util.partitioner.tile_extent_from_rank_metadata( + result = ndsl.util.partitioner.tile_extent_from_rank_metadata( array_dims, array_extent, layout ) assert result == tile_extent @@ -115,7 +115,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e ), [ pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (8, 8), (1, 1), 0, @@ -125,7 +125,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="6_rank_centered", ), pytest.param( - [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (10, 8, 8), (1, 1), 0, @@ -135,7 +135,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="6_rank_centered_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (11, 8, 8), (1, 1), 0, @@ -145,7 +145,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="6_rank_centered_z_interface", ), pytest.param( - [pace.util.Y_INTERFACE_DIM, pace.util.X_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_DIM], (9, 8), (1, 1), 0, @@ -155,7 +155,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="6_rank_y_interface", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_INTERFACE_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_INTERFACE_DIM], (8, 9), (1, 1), 0, @@ -165,7 +165,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="6_rank_x_interface", ), pytest.param( - [pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM], (9, 9), (1, 1), 0, @@ -175,7 +175,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="6_rank_both_interface", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (8, 8), (2, 2), 0, @@ -185,7 +185,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="24_rank_centered_left", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (8, 8), (2, 2), 3, @@ -195,7 +195,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="24_rank_centered_right", ), pytest.param( - [pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM], (9, 9), (2, 2), 0, @@ -205,7 +205,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="24_rank_interface_left_no_overlap", ), pytest.param( - [pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM], (9, 9), (2, 2), 3, @@ -215,7 +215,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="24_rank_interface_right_no_overlap", ), pytest.param( - [pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM], (9, 9), (2, 2), 0, @@ -225,7 +225,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="24_rank_interface_left_overlap", ), pytest.param( - [pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM], (9, 9), (2, 2), 3, @@ -235,7 +235,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="24_rank_interface_right_overlap", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (4, 4), (1, 2), 0, @@ -245,7 +245,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="12_rank_no_interface_right_overlap", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (4, 4), (1, 2), 1, @@ -255,7 +255,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="12_rank_no_interface_right_overlap", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (4, 4), (1, 2), 1, @@ -265,7 +265,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="12_rank_centered_right_no_overlap_rectangle_layout", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 4, 4), (1, 3), 0, @@ -275,7 +275,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="18_rank_left_no_overlap_rectangle_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 4, 4), (1, 3), 1, @@ -285,7 +285,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="18_rank_mid_no_overlap_rectangle_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 4, 4), (1, 3), 2, @@ -295,7 +295,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="18_rank_right_no_overlap_rectangle_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 4, 4), (2, 3), 0, @@ -305,7 +305,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="36_rank_botleft_right_no_overlap_rectangle_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 4, 4), (2, 3), 1, @@ -315,7 +315,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="36_rank_botmid_right_no_overlap_rectangle_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 4, 4), (2, 3), 2, @@ -325,7 +325,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="36_rank_botright_right_no_overlap_rectangle_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 4, 4), (2, 3), 3, @@ -335,7 +335,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="36_rank_topleft_no_overlap_rectangle_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 4, 4), (2, 3), 4, @@ -345,7 +345,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="36_rank_topmid_no_overlap_rectangle_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 4, 4), (2, 3), 5, @@ -355,7 +355,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="36_rank_topright_no_overlap_rectangle_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 8, 8), (3, 3), 0, @@ -365,7 +365,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="54_rank_botleft_no_overlap_square_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 8, 8), (3, 3), 1, @@ -375,7 +375,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="54_rank_botmid_no_overlap_square_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 8, 8), (3, 3), 4, @@ -385,7 +385,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="54_rank_midmid_no_overlap_square_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 8, 8), (3, 3), 5, @@ -395,7 +395,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="54_rank_midright_no_overlap_square_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 8, 8), (3, 3), 8, @@ -405,7 +405,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="54_rank_topright_no_overlap_square_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 8, 8), (3, 3), 0, @@ -415,7 +415,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="54_rank_botleft_no_overlap_square_layout_sixth_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 8, 8), (3, 3), 1, @@ -425,7 +425,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="54_rank_botmid_no_overlap_square_layout_sixth_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 8, 8), (3, 3), 4, @@ -435,7 +435,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="54_rank_midmid_no_overlap_square_layout_sixth_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 8, 8), (3, 3), 5, @@ -445,7 +445,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="54_rank_midright_no_overlap_square_layout_sixth_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 8, 8), (3, 3), 8, @@ -455,7 +455,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="54_rank_topright_no_overlap_square_layout_half_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 16, 16), (4, 4), 0, @@ -465,7 +465,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="96_rank_farbotfarleft_no_overlap_square_layout_third_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 16, 16), (4, 4), 1, @@ -475,7 +475,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="96_rank_farbotcloseleft_no_overlap_square_layout_third_edge_tiles_3d", ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 16, 16), (4, 4), 6, @@ -488,7 +488,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e ), ), pytest.param( - [pace.util.Z_INTERFACE_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (5, 16, 16), (4, 4), 14, @@ -498,7 +498,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="96_rank_fartopcloseright_no_overlap_square_layout_third_edge_tiles_3d", ), pytest.param( - [pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM], (13, 13), (2, 4), 1, @@ -508,7 +508,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="48_rank_botcloseleft_interface_right_overlap", ), pytest.param( - [pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM], (13, 13), (2, 4), 1, @@ -518,7 +518,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="48_rank_botcloseleft_interface_overlap_half_edge", ), pytest.param( - [pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM], (13, 13), (2, 4), 7, @@ -528,7 +528,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="48_rank_topfarright_interface_overlap_half_edge", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (12, 12), (2, 4), 0, @@ -538,7 +538,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="48_rank_botfarleft_overlap_half_edge", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_INTERFACE_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_INTERFACE_DIM], (12, 13), (3, 4), 0, @@ -548,7 +548,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="72_rank_botfarleft_x_interface_half_edge", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_INTERFACE_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_INTERFACE_DIM], (12, 13), (3, 4), 1, @@ -558,7 +558,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="72_rank_botcloseleft_x_interface_half_edge", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_INTERFACE_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_INTERFACE_DIM], (12, 13), (3, 4), 11, @@ -568,7 +568,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="72_rank_topfarright_x_interface_half_edge", ), pytest.param( - [pace.util.Y_INTERFACE_DIM, pace.util.X_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_DIM], (13, 12), (3, 4), 0, @@ -578,7 +578,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="72_rank_botfarleft_y_interface_half_edge", ), pytest.param( - [pace.util.Y_INTERFACE_DIM, pace.util.X_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_DIM], (13, 12), (3, 4), 1, @@ -588,7 +588,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="72_rank_botcloseleft_y_interface_half_edge", ), pytest.param( - [pace.util.Y_INTERFACE_DIM, pace.util.X_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_DIM], (13, 12), (3, 4), 8, @@ -598,7 +598,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e id="72_rank_topfarleft_y_interface_half_edge", ), pytest.param( - [pace.util.Y_INTERFACE_DIM, pace.util.X_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_DIM], (13, 12), (3, 4), 11, @@ -613,7 +613,7 @@ def test_tile_extent_from_rank_metadata(array_extent, array_dims, layout, tile_e def test_subtile_slice( array_dims, tile_extent, layout, rank, subtile_slice, overlap, edge_interior_ratio ): - partitioner = pace.util.TilePartitioner(layout, edge_interior_ratio) + partitioner = ndsl.util.TilePartitioner(layout, edge_interior_ratio) result = partitioner.subtile_slice(rank, array_dims, tile_extent, overlap) assert result == subtile_slice @@ -625,7 +625,7 @@ def test_subtile_slice( ), [ pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (16, 16), (5, 5), 0, @@ -635,7 +635,7 @@ def test_subtile_slice( id="150_rank_yx_botfarleft", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (16, 16), (5, 5), 1, @@ -645,7 +645,7 @@ def test_subtile_slice( id="150_rank_yx_botcloseleft", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (16, 16), (5, 5), 8, @@ -655,7 +655,7 @@ def test_subtile_slice( id="150_rank_yx_closebotcloseright", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (16, 16), (5, 5), 14, @@ -665,7 +665,7 @@ def test_subtile_slice( id="150_rank_yx_midfarright", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (16, 16), (5, 5), 24, @@ -675,7 +675,7 @@ def test_subtile_slice( id="150_rank_yx_fartopfarright", ), pytest.param( - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], (16, 16), (5, 5), 0, @@ -685,7 +685,7 @@ def test_subtile_slice( id="150_rank_xy_botfarleft", ), pytest.param( - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], (16, 16), (5, 5), 1, @@ -695,7 +695,7 @@ def test_subtile_slice( id="150_rank_xy_botcloseleft", ), pytest.param( - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], (16, 16), (5, 5), 8, @@ -705,7 +705,7 @@ def test_subtile_slice( id="150_rank_xy_closebotcloseright", ), pytest.param( - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], (16, 16), (5, 5), 14, @@ -715,7 +715,7 @@ def test_subtile_slice( id="150_rank_xy_midfarright", ), pytest.param( - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], (16, 16), (5, 5), 24, @@ -730,7 +730,7 @@ def test_subtile_slice( def test_subtile_slice_even_grid_odd_layout( array_dims, tile_extent, layout, rank, subtile_slice, overlap, edge_interior_ratio ): - partitioner = pace.util.TilePartitioner(layout, edge_interior_ratio) + partitioner = ndsl.util.TilePartitioner(layout, edge_interior_ratio) result = partitioner.subtile_slice(rank, array_dims, tile_extent, overlap) assert result == subtile_slice @@ -742,7 +742,7 @@ def test_subtile_slice_even_grid_odd_layout( ), [ pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (13, 19), (4, 4), 24, @@ -755,7 +755,7 @@ def test_subtile_slice_even_grid_odd_layout( id="48_rank_odd_grid_even_layout_y", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (12, 19), (4, 2), 24, @@ -779,7 +779,7 @@ def test_subtile_slice_odd_grid_even_layout_no_interface( overlap, edge_interior_ratio, ): - partitioner = pace.util.TilePartitioner(layout, edge_interior_ratio) + partitioner = ndsl.util.TilePartitioner(layout, edge_interior_ratio) with pytest.raises(ValueError, match=expected_error_string): partitioner.subtile_slice(rank, array_dims, tile_extent, overlap) @@ -788,7 +788,7 @@ def test_subtile_slice_odd_grid_even_layout_no_interface( "array_dims, tile_extent, layout, edge_interior_ratio, rank_extent", [ pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (12, 12), (2, 3), 1.0, @@ -796,7 +796,7 @@ def test_subtile_slice_odd_grid_even_layout_no_interface( id="36_rank_full_edge_tiles", ), pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (12, 12), (2, 3), 0.5, @@ -804,7 +804,7 @@ def test_subtile_slice_odd_grid_even_layout_no_interface( id="36_rank_half_edge_tiles", ), pytest.param( - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], (12, 12), (3, 4), 0.5, @@ -812,7 +812,7 @@ def test_subtile_slice_odd_grid_even_layout_no_interface( id="72_rank_half_edge_tiles", ), pytest.param( - [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM], + [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM], (13, 12), (3, 4), 0.5, @@ -820,7 +820,7 @@ def test_subtile_slice_odd_grid_even_layout_no_interface( id="72_rank_half_edge_tiles_x_interface", ), pytest.param( - [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM], (12, 13), (3, 4), 0.5, @@ -828,7 +828,7 @@ def test_subtile_slice_odd_grid_even_layout_no_interface( id="72_rank_half_edge_tiles_y_interface", ), pytest.param( - [pace.util.X_DIM, pace.util.Z_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Z_DIM, ndsl.util.Y_DIM], (12, 5, 12), (3, 4), 0.5, @@ -837,10 +837,10 @@ def test_subtile_slice_odd_grid_even_layout_no_interface( ), pytest.param( [ - pace.util.TILE_DIM, - pace.util.X_DIM, - pace.util.Z_DIM, - pace.util.Y_DIM, + ndsl.util.TILE_DIM, + ndsl.util.X_DIM, + ndsl.util.Z_DIM, + ndsl.util.Y_DIM, ], (6, 12, 5, 12), (3, 4), @@ -854,11 +854,11 @@ def test_subtile_slice_odd_grid_even_layout_no_interface( def test_subtile_extents_from_tile_metadata( array_dims, tile_extent, layout, edge_interior_ratio, rank_extent ): - result = pace.util.partitioner._subtile_extents_from_tile_metadata( + result = ndsl.util.partitioner._subtile_extents_from_tile_metadata( array_dims, tile_extent, layout, edge_interior_ratio ) assert result == rank_extent - result = pace.util.partitioner._subtile_extents_from_tile_metadata( + result = ndsl.util.partitioner._subtile_extents_from_tile_metadata( dims=array_dims, tile_extent=tile_extent, layout=layout, @@ -875,7 +875,7 @@ def test_subtile_extents_from_tile_metadata( ), [ pytest.param( - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (12, 12), (3, 4), 1.0, @@ -901,19 +901,19 @@ def test_tile_extent_from_metadata( expected_extent, expected_error_string, ): - partitioner = pace.util.TilePartitioner(layout, half_edge_interior_ratio) + partitioner = ndsl.util.TilePartitioner(layout, half_edge_interior_ratio) subtile_slice = partitioner.subtile_slice(0, array_dims, tile_extent, False) assert subtile_slice == expected_slice slice_extent = ( subtile_slice[0].stop - subtile_slice[0].start, subtile_slice[1].stop - subtile_slice[1].start, ) - rank_extent = pace.util.partitioner.tile_extent_from_rank_metadata( + rank_extent = ndsl.util.partitioner.tile_extent_from_rank_metadata( array_dims, slice_extent, layout, full_edge_interior_ratio ) assert rank_extent == expected_extent with pytest.raises(NotImplementedError, match=expected_error_string): - pace.util.partitioner.tile_extent_from_rank_metadata( + ndsl.util.partitioner.tile_extent_from_rank_metadata( array_dims, slice_extent, layout, half_edge_interior_ratio ) @@ -926,10 +926,10 @@ def test_tile_extent_from_metadata( [ pytest.param( [ - pace.util.TILE_DIM, - pace.util.X_DIM, - pace.util.Z_DIM, - pace.util.Y_DIM, + ndsl.util.TILE_DIM, + ndsl.util.X_DIM, + ndsl.util.Z_DIM, + ndsl.util.Y_DIM, ], (6, 12, 5, 12), (3, 4), @@ -941,10 +941,10 @@ def test_tile_extent_from_metadata( ), pytest.param( [ - pace.util.TILE_DIM, - pace.util.Y_DIM, - pace.util.Z_DIM, - pace.util.X_DIM, + ndsl.util.TILE_DIM, + ndsl.util.Y_DIM, + ndsl.util.Z_DIM, + ndsl.util.X_DIM, ], (6, 12, 5, 12), (3, 4), @@ -956,10 +956,10 @@ def test_tile_extent_from_metadata( ), pytest.param( [ - pace.util.Z_DIM, - pace.util.Y_DIM, - pace.util.TILE_DIM, - pace.util.X_DIM, + ndsl.util.Z_DIM, + ndsl.util.Y_DIM, + ndsl.util.TILE_DIM, + ndsl.util.X_DIM, ], (5, 12, 6, 12), (3, 4), @@ -981,10 +981,10 @@ def test_subtile_extent_with_tile_dimensions( cubedsphere_expected, ): data_array = np.zeros((tile_extent)) - quantity = pace.util.Quantity(data_array, array_dims, "dimensionless", [0, 0, 0, 0]) + quantity = ndsl.util.Quantity(data_array, array_dims, "dimensionless", [0, 0, 0, 0]) - tile_partitioner = pace.util.TilePartitioner(layout, edge_interior_ratio) - cubedsphere_partitioner = pace.util.CubedSpherePartitioner(tile_partitioner) + tile_partitioner = ndsl.util.TilePartitioner(layout, edge_interior_ratio) + cubedsphere_partitioner = ndsl.util.CubedSpherePartitioner(tile_partitioner) tile_result = tile_partitioner.subtile_extent(quantity.metadata, rank) assert tile_result == tile_expected diff --git a/util/tests/test_partitioner_boundaries.py b/ndsl/tests/test_partitioner_boundaries.py similarity index 84% rename from util/tests/test_partitioner_boundaries.py rename to ndsl/tests/test_partitioner_boundaries.py index e838a014..b78074ba 100644 --- a/util/tests/test_partitioner_boundaries.py +++ b/ndsl/tests/test_partitioner_boundaries.py @@ -1,7 +1,7 @@ import pytest -import pace.util -import pace.util.partitioner +import ndsl.util +import ndsl.util.partitioner # the test examples for the 2x2 cube here were recorded by manually inspecting @@ -10,25 +10,25 @@ @pytest.fixture def partitioner_1_by_1(): - grid = pace.util.TilePartitioner((1, 1)) - return pace.util.CubedSpherePartitioner(grid) + grid = ndsl.util.TilePartitioner((1, 1)) + return ndsl.util.CubedSpherePartitioner(grid) @pytest.fixture def partitioner_2_by_2(): - grid = pace.util.TilePartitioner((2, 2)) - return pace.util.CubedSpherePartitioner(grid) + grid = ndsl.util.TilePartitioner((2, 2)) + return ndsl.util.CubedSpherePartitioner(grid) @pytest.fixture def tile_partitioner_3_by_3(): - return pace.util.TilePartitioner((3, 3)) + return ndsl.util.TilePartitioner((3, 3)) @pytest.fixture def partitioner_3_by_3(): - grid = pace.util.TilePartitioner((3, 3)) - return pace.util.CubedSpherePartitioner(grid) + grid = ndsl.util.TilePartitioner((3, 3)) + return ndsl.util.CubedSpherePartitioner(grid) @pytest.mark.parametrize( @@ -64,7 +64,7 @@ def partitioner_3_by_3(): def test_2_by_2_left_edge( partitioner_2_by_2, from_rank, to_rank, n_clockwise_rotations ): - edge = partitioner_2_by_2.boundary(pace.util.WEST, from_rank) + edge = partitioner_2_by_2.boundary(ndsl.util.WEST, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -88,7 +88,7 @@ def test_2_by_2_left_edge( def test_single_3_by_3_left_edge( tile_partitioner_3_by_3, from_rank, to_rank, n_clockwise_rotations ): - edge = tile_partitioner_3_by_3.boundary(pace.util.WEST, from_rank) + edge = tile_partitioner_3_by_3.boundary(ndsl.util.WEST, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -102,7 +102,7 @@ def test_single_3_by_3_left_edge( def test_1_by_1_left_edge( partitioner_1_by_1, from_rank, to_rank, n_clockwise_rotations ): - edge = partitioner_1_by_1.boundary(pace.util.WEST, from_rank) + edge = partitioner_1_by_1.boundary(ndsl.util.WEST, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -120,7 +120,7 @@ def test_1_by_1_left_edge( ) @pytest.mark.cpu_only def test_rotate_subtile_rank(rank, layout, n_clockwise_rotations, new_rank): - result = pace.util.partitioner.rotate_subtile_rank( + result = ndsl.util.partitioner.rotate_subtile_rank( rank, layout, n_clockwise_rotations ) assert result == new_rank @@ -157,7 +157,7 @@ def test_rotate_subtile_rank(rank, layout, n_clockwise_rotations, new_rank): ) @pytest.mark.cpu_only def test_2_by_2_top_edge(partitioner_2_by_2, from_rank, to_rank, n_clockwise_rotations): - edge = partitioner_2_by_2.boundary(pace.util.NORTH, from_rank) + edge = partitioner_2_by_2.boundary(ndsl.util.NORTH, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -181,7 +181,7 @@ def test_2_by_2_top_edge(partitioner_2_by_2, from_rank, to_rank, n_clockwise_rot def test_single_3_by_3_top_edge( tile_partitioner_3_by_3, from_rank, to_rank, n_clockwise_rotations ): - edge = tile_partitioner_3_by_3.boundary(pace.util.NORTH, from_rank) + edge = tile_partitioner_3_by_3.boundary(ndsl.util.NORTH, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -193,7 +193,7 @@ def test_single_3_by_3_top_edge( ) @pytest.mark.cpu_only def test_1_by_1_top_edge(partitioner_1_by_1, from_rank, to_rank, n_clockwise_rotations): - edge = partitioner_1_by_1.boundary(pace.util.NORTH, from_rank) + edge = partitioner_1_by_1.boundary(ndsl.util.NORTH, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -232,7 +232,7 @@ def test_1_by_1_top_edge(partitioner_1_by_1, from_rank, to_rank, n_clockwise_rot def test_2_by_2_bottom_edge( partitioner_2_by_2, from_rank, to_rank, n_clockwise_rotations ): - edge = partitioner_2_by_2.boundary(pace.util.SOUTH, from_rank) + edge = partitioner_2_by_2.boundary(ndsl.util.SOUTH, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -256,7 +256,7 @@ def test_2_by_2_bottom_edge( def test_single_3_by_3_bottom_edge( tile_partitioner_3_by_3, from_rank, to_rank, n_clockwise_rotations ): - edge = tile_partitioner_3_by_3.boundary(pace.util.SOUTH, from_rank) + edge = tile_partitioner_3_by_3.boundary(ndsl.util.SOUTH, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -270,7 +270,7 @@ def test_single_3_by_3_bottom_edge( def test_1_by_1_bottom_edge( partitioner_1_by_1, from_rank, to_rank, n_clockwise_rotations ): - edge = partitioner_1_by_1.boundary(pace.util.SOUTH, from_rank) + edge = partitioner_1_by_1.boundary(ndsl.util.SOUTH, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -309,7 +309,7 @@ def test_1_by_1_bottom_edge( def test_2_by_2_right_edge( partitioner_2_by_2, from_rank, to_rank, n_clockwise_rotations ): - edge = partitioner_2_by_2.boundary(pace.util.EAST, from_rank) + edge = partitioner_2_by_2.boundary(ndsl.util.EAST, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -333,7 +333,7 @@ def test_2_by_2_right_edge( def test_single_3_by_3_right_edge( tile_partitioner_3_by_3, from_rank, to_rank, n_clockwise_rotations ): - edge = tile_partitioner_3_by_3.boundary(pace.util.EAST, from_rank) + edge = tile_partitioner_3_by_3.boundary(ndsl.util.EAST, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -347,7 +347,7 @@ def test_single_3_by_3_right_edge( def test_1_by_1_right_edge( partitioner_1_by_1, from_rank, to_rank, n_clockwise_rotations ): - edge = partitioner_1_by_1.boundary(pace.util.EAST, from_rank) + edge = partitioner_1_by_1.boundary(ndsl.util.EAST, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -356,28 +356,28 @@ def test_1_by_1_right_edge( @pytest.mark.parametrize("from_rank", [0, 1, 2, 3, 4, 5]) @pytest.mark.cpu_only def test_1_by_1_top_left_corner(partitioner_1_by_1, from_rank): - corner = partitioner_1_by_1.boundary(pace.util.NORTHWEST, from_rank) + corner = partitioner_1_by_1.boundary(ndsl.util.NORTHWEST, from_rank) assert corner is None @pytest.mark.parametrize("from_rank", [0, 1, 2, 3, 4, 5]) @pytest.mark.cpu_only def test_1_by_1_top_right_corner(partitioner_1_by_1, from_rank): - corner = partitioner_1_by_1.boundary(pace.util.NORTHEAST, from_rank) + corner = partitioner_1_by_1.boundary(ndsl.util.NORTHEAST, from_rank) assert corner is None @pytest.mark.parametrize("from_rank", [0, 1, 2, 3, 4, 5]) @pytest.mark.cpu_only def test_1_by_1_bottom_left_corner(partitioner_1_by_1, from_rank): - corner = partitioner_1_by_1.boundary(pace.util.SOUTHWEST, from_rank) + corner = partitioner_1_by_1.boundary(ndsl.util.SOUTHWEST, from_rank) assert corner is None @pytest.mark.parametrize("from_rank", [0, 1, 2, 3, 4, 5]) @pytest.mark.cpu_only def test_1_by_1_bottom_right_corner(partitioner_1_by_1, from_rank): - corner = partitioner_1_by_1.boundary(pace.util.SOUTHEAST, from_rank) + corner = partitioner_1_by_1.boundary(ndsl.util.SOUTHEAST, from_rank) assert corner is None @@ -414,7 +414,7 @@ def test_1_by_1_bottom_right_corner(partitioner_1_by_1, from_rank): def test_2_by_2_top_left_corner( partitioner_2_by_2, from_rank, to_rank, n_clockwise_rotations ): - corner = partitioner_2_by_2.boundary(pace.util.NORTHWEST, from_rank) + corner = partitioner_2_by_2.boundary(ndsl.util.NORTHWEST, from_rank) if to_rank is None: assert corner is None else: @@ -441,7 +441,7 @@ def test_2_by_2_top_left_corner( def test_single_3_by_3_top_left_corner( tile_partitioner_3_by_3, from_rank, to_rank, n_clockwise_rotations ): - edge = tile_partitioner_3_by_3.boundary(pace.util.NORTHWEST, from_rank) + edge = tile_partitioner_3_by_3.boundary(ndsl.util.NORTHWEST, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -450,23 +450,23 @@ def test_single_3_by_3_top_left_corner( @pytest.mark.parametrize( "layout, boundary_type, from_rank, to_rank", ( - ((1, 1), pace.util.WEST, 0, 0), - ((1, 1), pace.util.EAST, 0, 0), - ((1, 1), pace.util.NORTH, 0, 0), - ((1, 1), pace.util.SOUTH, 0, 0), - ((2, 2), pace.util.WEST, 0, 1), - ((2, 2), pace.util.EAST, 0, 1), - ((2, 2), pace.util.NORTH, 0, 2), - ((2, 2), pace.util.SOUTH, 0, 2), - ((2, 2), pace.util.WEST, 3, 2), - ((2, 2), pace.util.EAST, 3, 2), - ((2, 2), pace.util.NORTH, 3, 1), - ((2, 2), pace.util.SOUTH, 3, 1), + ((1, 1), ndsl.util.WEST, 0, 0), + ((1, 1), ndsl.util.EAST, 0, 0), + ((1, 1), ndsl.util.NORTH, 0, 0), + ((1, 1), ndsl.util.SOUTH, 0, 0), + ((2, 2), ndsl.util.WEST, 0, 1), + ((2, 2), ndsl.util.EAST, 0, 1), + ((2, 2), ndsl.util.NORTH, 0, 2), + ((2, 2), ndsl.util.SOUTH, 0, 2), + ((2, 2), ndsl.util.WEST, 3, 2), + ((2, 2), ndsl.util.EAST, 3, 2), + ((2, 2), ndsl.util.NORTH, 3, 1), + ((2, 2), ndsl.util.SOUTH, 3, 1), ), ) @pytest.mark.cpu_only def test_tile_boundary(layout, boundary_type, from_rank, to_rank): - tile = pace.util.TilePartitioner(layout) + tile = ndsl.util.TilePartitioner(layout) boundary = tile.boundary(boundary_type, from_rank) assert boundary.from_rank == from_rank assert boundary.to_rank == to_rank @@ -506,7 +506,7 @@ def test_tile_boundary(layout, boundary_type, from_rank, to_rank): def test_2_by_2_top_right_corner( partitioner_2_by_2, from_rank, to_rank, n_clockwise_rotations ): - corner = partitioner_2_by_2.boundary(pace.util.NORTHEAST, from_rank) + corner = partitioner_2_by_2.boundary(ndsl.util.NORTHEAST, from_rank) if to_rank is None: assert corner is None else: @@ -533,7 +533,7 @@ def test_2_by_2_top_right_corner( def test_single_3_by_3_top_right_corner( tile_partitioner_3_by_3, from_rank, to_rank, n_clockwise_rotations ): - edge = tile_partitioner_3_by_3.boundary(pace.util.NORTHEAST, from_rank) + edge = tile_partitioner_3_by_3.boundary(ndsl.util.NORTHEAST, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -572,7 +572,7 @@ def test_single_3_by_3_top_right_corner( def test_2_by_2_bottom_left_corner( partitioner_2_by_2, from_rank, to_rank, n_clockwise_rotations ): - corner = partitioner_2_by_2.boundary(pace.util.SOUTHWEST, from_rank) + corner = partitioner_2_by_2.boundary(ndsl.util.SOUTHWEST, from_rank) if to_rank is None: assert corner is None else: @@ -599,7 +599,7 @@ def test_2_by_2_bottom_left_corner( def test_single_3_by_3_bottom_left_corner( tile_partitioner_3_by_3, from_rank, to_rank, n_clockwise_rotations ): - edge = tile_partitioner_3_by_3.boundary(pace.util.SOUTHWEST, from_rank) + edge = tile_partitioner_3_by_3.boundary(ndsl.util.SOUTHWEST, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations @@ -638,7 +638,7 @@ def test_single_3_by_3_bottom_left_corner( def test_2_by_2_bottom_right_corner( partitioner_2_by_2, from_rank, to_rank, n_clockwise_rotations ): - corner = partitioner_2_by_2.boundary(pace.util.SOUTHEAST, from_rank) + corner = partitioner_2_by_2.boundary(ndsl.util.SOUTHEAST, from_rank) if to_rank is None: assert corner is None else: @@ -665,16 +665,16 @@ def test_2_by_2_bottom_right_corner( def test_single_3_by_3_bottom_right_corner( tile_partitioner_3_by_3, from_rank, to_rank, n_clockwise_rotations ): - edge = tile_partitioner_3_by_3.boundary(pace.util.SOUTHEAST, from_rank) + edge = tile_partitioner_3_by_3.boundary(ndsl.util.SOUTHEAST, from_rank) assert edge.from_rank == from_rank assert edge.to_rank == to_rank assert edge.n_clockwise_rotations == n_clockwise_rotations def test_boundary_returns_correct_boundary_type(): - tile = pace.util.TilePartitioner((3, 3)) - partitioner = pace.util.CubedSpherePartitioner(tile) - for boundary_type in pace.util.BOUNDARY_TYPES: + tile = ndsl.util.TilePartitioner((3, 3)) + partitioner = ndsl.util.CubedSpherePartitioner(tile) + for boundary_type in ndsl.util.BOUNDARY_TYPES: boundary = partitioner.boundary(boundary_type, rank=4) # center face assert boundary.boundary_type == boundary_type @@ -687,10 +687,10 @@ def test_boundary_returns_correct_boundary_type(): @pytest.mark.parametrize( "boundary_type, from_rank, to_rank, n_clockwise_rotations", [ - (pace.util.WEST, 0, 4 * 9 + 8, 1), - (pace.util.SOUTH, 0, 5 * 9 + 6, 0), - (pace.util.WEST, 42, 2 * 9 + 6, 1), - (pace.util.NORTH, 42, 6, 3), + (ndsl.util.WEST, 0, 4 * 9 + 8, 1), + (ndsl.util.SOUTH, 0, 5 * 9 + 6, 0), + (ndsl.util.WEST, 42, 2 * 9 + 6, 1), + (ndsl.util.NORTH, 42, 6, 3), ], ) @pytest.mark.cpu_only @@ -709,11 +709,11 @@ def test_3_by_3_difficult_cases( @pytest.mark.parametrize("layout", [(1, 1), (2, 2), (4, 4)]) @pytest.mark.cpu_only def test_edge_boundaries_pair(layout, subtests): - order = [pace.util.WEST, pace.util.NORTH, pace.util.EAST, pace.util.SOUTH] - tile = pace.util.TilePartitioner(layout) - partitioner = pace.util.CubedSpherePartitioner(tile) + order = [ndsl.util.WEST, ndsl.util.NORTH, ndsl.util.EAST, ndsl.util.SOUTH] + tile = ndsl.util.TilePartitioner(layout) + partitioner = ndsl.util.CubedSpherePartitioner(tile) for rank in range(partitioner.total_ranks): - for boundary_type in pace.util.EDGE_BOUNDARY_TYPES: + for boundary_type in ndsl.util.EDGE_BOUNDARY_TYPES: with subtests.test(rank=rank, boundary_type=boundary_type): out_boundary = partitioner.boundary(boundary_type, rank) in_boundary = partitioner.boundary( @@ -734,15 +734,15 @@ def test_edge_boundaries_pair(layout, subtests): @pytest.mark.cpu_only def test_corner_boundaries_pair(layout, subtests): order = [ - pace.util.NORTHWEST, - pace.util.NORTHEAST, - pace.util.SOUTHEAST, - pace.util.SOUTHWEST, + ndsl.util.NORTHWEST, + ndsl.util.NORTHEAST, + ndsl.util.SOUTHEAST, + ndsl.util.SOUTHWEST, ] - tile = pace.util.TilePartitioner(layout) - partitioner = pace.util.CubedSpherePartitioner(tile) + tile = ndsl.util.TilePartitioner(layout) + partitioner = ndsl.util.CubedSpherePartitioner(tile) for rank in range(partitioner.total_ranks): - for boundary_type in pace.util.CORNER_BOUNDARY_TYPES: + for boundary_type in ndsl.util.CORNER_BOUNDARY_TYPES: with subtests.test(rank=rank, boundary_type=boundary_type): out_boundary = partitioner.boundary(boundary_type, rank) if out_boundary is not None: diff --git a/util/tests/test_rotate.py b/ndsl/tests/test_rotate.py similarity index 82% rename from util/tests/test_rotate.py rename to ndsl/tests/test_rotate.py index 7be38ff9..c84562d0 100644 --- a/util/tests/test_rotate.py +++ b/ndsl/tests/test_rotate.py @@ -1,7 +1,7 @@ import numpy as np import pytest -import pace.util.rotate +import ndsl.util.rotate @pytest.fixture @@ -18,91 +18,91 @@ def start_data(request, numpy): pytest.param( np.array([1.0]), 0, - [pace.util.Z_DIM], + [ndsl.util.Z_DIM], np.array([1.0]), id="1_value_no_rotation", ), pytest.param( np.array([1.0]), 1, - [pace.util.Z_DIM], + [ndsl.util.Z_DIM], np.array([1.0]), id="1_value_1_rotation", ), pytest.param( np.array([1.0, 2.0]), 1, - [pace.util.X_DIM], + [ndsl.util.X_DIM], np.array([2.0, 1.0]), id="1d_x_one_rotation", ), pytest.param( np.array([1.0, 2.0]), 2, - [pace.util.X_DIM], + [ndsl.util.X_DIM], np.array([2.0, 1.0]), id="1d_x_two_rotations", ), pytest.param( np.array([1.0, 2.0]), 1, - [pace.util.Y_DIM], + [ndsl.util.Y_DIM], np.array([1.0, 2.0]), id="1d_y_one_rotation", ), pytest.param( np.array([1.0, 2.0]), 2, - [pace.util.Y_DIM], + [ndsl.util.Y_DIM], np.array([2.0, 1.0]), id="1d_y_two_rotations", ), pytest.param( np.zeros([2, 3]), 0, - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], np.zeros([2, 3]), id="2d_no_rotation", ), pytest.param( np.zeros([2, 3]), 1, - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], np.zeros([3, 2]), id="2d_1_rotation", ), pytest.param( np.zeros([2, 3]), 2, - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], np.zeros([2, 3]), id="2d_2_rotations", ), pytest.param( np.zeros([2, 3]), 3, - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], np.zeros([3, 2]), id="2d_3_rotations", ), pytest.param( np.arange(5)[:, None], 1, - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], np.arange(5)[None, ::-1], id="2d_x_increasing_values", ), pytest.param( np.arange(5)[:, None], 2, - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], np.arange(5)[::-1, None], id="2d_x_increasing_values_double_rotate", ), pytest.param( np.arange(5)[None, :], 1, - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], np.arange(5)[:, None], id="2d_y_increasing_values", ), @@ -112,7 +112,7 @@ def start_data(request, numpy): def test_rotate_scalar_data( start_data, n_clockwise_rotations, dims, numpy, target_data ): - result = pace.util.rotate.rotate_scalar_data( + result = ndsl.util.rotate.rotate_scalar_data( start_data, dims, numpy, n_clockwise_rotations ) numpy.testing.assert_array_equal(result, target_data) @@ -124,42 +124,42 @@ def test_rotate_scalar_data( pytest.param( (np.array([1.0]), np.array([1.0])), 0, - [pace.util.Z_DIM], + [ndsl.util.Z_DIM], (np.array([1.0]), np.array([1.0])), id="scalar_no_rotation", ), pytest.param( (np.array([1.0]), np.array([1.0])), 1, - [pace.util.Z_DIM], + [ndsl.util.Z_DIM], (np.array([1.0]), np.array([-1.0])), id="scalar_1_rotation", ), pytest.param( (np.array([1.0]), np.array([1.0])), 2, - [pace.util.Z_DIM], + [ndsl.util.Z_DIM], (np.array([-1.0]), np.array([-1.0])), id="scalar_2_rotations", ), pytest.param( (np.array([1.0]), np.array([1.0])), 3, - [pace.util.Z_DIM], + [ndsl.util.Z_DIM], (np.array([-1.0]), np.array([1.0])), id="scalar_3_rotations", ), pytest.param( (np.ones([3, 2]), np.ones([2, 3])), 3, - [pace.util.Y_INTERFACE_DIM, pace.util.X_DIM], + [ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_DIM], (np.ones([3, 2]) * -1, np.ones([2, 3])), id="2d_array_flat_values", ), pytest.param( (np.arange(5)[:, None], np.arange(5)[None, :]), 1, - [pace.util.X_DIM, pace.util.Y_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM], (np.arange(5)[:, None], np.arange(5)[None, ::-1] * -1), id="2d_array_increasing_values", ), @@ -171,7 +171,7 @@ def test_rotate_vector_data( ): x_data, y_data = start_data x_target, y_target = target_data - x_result, y_result = pace.util.rotate.rotate_vector_data( + x_result, y_result = ndsl.util.rotate.rotate_vector_data( x_data, y_data, n_clockwise_rotations, dims, numpy ) numpy.testing.assert_array_equal(x_result, x_target) diff --git a/util/tests/test_sync_shared_boundary.py b/ndsl/tests/test_sync_shared_boundary.py similarity index 90% rename from util/tests/test_sync_shared_boundary.py rename to ndsl/tests/test_sync_shared_boundary.py index b5743590..46e804d2 100644 --- a/util/tests/test_sync_shared_boundary.py +++ b/ndsl/tests/test_sync_shared_boundary.py @@ -1,6 +1,6 @@ import pytest -import pace.util +import ndsl.util @pytest.fixture @@ -33,12 +33,12 @@ def total_ranks(ranks_per_tile): @pytest.fixture def tile_partitioner(layout): - return pace.util.TilePartitioner(layout) + return ndsl.util.TilePartitioner(layout) @pytest.fixture def cube_partitioner(tile_partitioner): - return pace.util.CubedSpherePartitioner(tile_partitioner) + return ndsl.util.CubedSpherePartitioner(tile_partitioner) @pytest.fixture @@ -47,12 +47,12 @@ def communicator_list(cube_partitioner, total_ranks): return_list = [] for rank in range(cube_partitioner.total_ranks): return_list.append( - pace.util.CubedSphereCommunicator( - comm=pace.util.testing.DummyComm( + ndsl.util.CubedSphereCommunicator( + comm=ndsl.util.testing.DummyComm( rank=rank, total_ranks=total_ranks, buffer_dict=shared_buffer ), partitioner=cube_partitioner, - timer=pace.util.Timer(), + timer=ndsl.util.Timer(), ) ) return return_list @@ -67,18 +67,18 @@ def rank_quantity_list(total_ranks, numpy, dtype, units=units): for rank in range(total_ranks): x_data = numpy.empty((3, 2), dtype=dtype) x_data[:] = rank - x_quantity = pace.util.Quantity( + x_quantity = ndsl.util.Quantity( x_data, - dims=(pace.util.Y_INTERFACE_DIM, pace.util.X_DIM), + dims=(ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_DIM), units=units, origin=(0, 0), extent=(3, 2), ) y_data = numpy.empty((2, 3), dtype=dtype) y_data[:] = rank - y_quantity = pace.util.Quantity( + y_quantity = ndsl.util.Quantity( y_data, - dims=(pace.util.Y_DIM, pace.util.X_INTERFACE_DIM), + dims=(ndsl.util.Y_DIM, ndsl.util.X_INTERFACE_DIM), units=units, origin=(0, 0), extent=(2, 3), @@ -133,17 +133,17 @@ def counting_quantity_list(total_ranks, numpy, dtype, units=units): quantity_list = [] for rank in range(total_ranks): x_data = numpy.array([[0, 1], [2, 3], [4, 5]]) + 6 * rank - x_quantity = pace.util.Quantity( + x_quantity = ndsl.util.Quantity( x_data, - dims=(pace.util.Y_INTERFACE_DIM, pace.util.X_DIM), + dims=(ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_DIM), units=units, origin=(0, 0), extent=(3, 2), ) y_data = 6 * total_ranks + numpy.array([[0, 1, 2], [3, 4, 5]]) + 6 * rank - y_quantity = pace.util.Quantity( + y_quantity = ndsl.util.Quantity( y_data, - dims=(pace.util.Y_DIM, pace.util.X_INTERFACE_DIM), + dims=(ndsl.util.Y_DIM, ndsl.util.X_INTERFACE_DIM), units=units, origin=(0, 0), extent=(2, 3), diff --git a/util/tests/test_tile_scatter.py b/ndsl/tests/test_tile_scatter.py similarity index 85% rename from util/tests/test_tile_scatter.py rename to ndsl/tests/test_tile_scatter.py index a9f57bbc..ea425b38 100644 --- a/util/tests/test_tile_scatter.py +++ b/ndsl/tests/test_tile_scatter.py @@ -1,7 +1,7 @@ import pytest -import pace.util -from pace.util.testing import DummyComm +import ndsl.util +from ndsl.util.testing import DummyComm def rank_scatter_results(communicator_list, quantity): @@ -19,7 +19,7 @@ def get_tile_communicator_list(partitioner): tile_communicator_list = [] for rank in range(total_ranks): tile_communicator_list.append( - pace.util.TileCommunicator( + ndsl.util.TileCommunicator( comm=DummyComm( rank=rank, total_ranks=total_ranks, buffer_dict=shared_buffer ), @@ -32,14 +32,14 @@ def get_tile_communicator_list(partitioner): @pytest.mark.parametrize("layout", [(1, 1), (1, 2), (2, 1), (2, 2), (3, 3)]) def test_interface_state_two_by_two_per_rank_scatter_tile(layout, numpy): state = { - "pos_j": pace.util.Quantity( + "pos_j": ndsl.util.Quantity( numpy.empty([layout[0] + 1, layout[1] + 1]), - dims=[pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM], + dims=[ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM], units="dimensionless", ), - "pos_i": pace.util.Quantity( + "pos_i": ndsl.util.Quantity( numpy.empty([layout[0] + 1, layout[1] + 1], dtype=numpy.int32), - dims=[pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM], + dims=[ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM], units="dimensionless", ), } @@ -47,7 +47,7 @@ def test_interface_state_two_by_two_per_rank_scatter_tile(layout, numpy): state["pos_j"].view[:, :] = numpy.arange(0, layout[0] + 1)[:, None] state["pos_i"].view[:, :] = numpy.arange(0, layout[1] + 1)[None, :] - partitioner = pace.util.TilePartitioner(layout) + partitioner = ndsl.util.TilePartitioner(layout) tile_communicator_list = get_tile_communicator_list(partitioner) for communicator, rank_array in rank_scatter_results( tile_communicator_list, state["pos_j"] @@ -76,24 +76,24 @@ def test_interface_state_two_by_two_per_rank_scatter_tile(layout, numpy): def test_centered_state_one_item_per_rank_scatter_tile(layout, numpy): total_ranks = layout[0] * layout[1] state = { - "rank": pace.util.Quantity( + "rank": ndsl.util.Quantity( numpy.empty([layout[0], layout[1]]), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="dimensionless", ), - "rank_pos_j": pace.util.Quantity( + "rank_pos_j": ndsl.util.Quantity( numpy.empty([layout[0], layout[1]]), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="dimensionless", ), - "rank_pos_i": pace.util.Quantity( + "rank_pos_i": ndsl.util.Quantity( numpy.empty([layout[0], layout[1]]), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="dimensionless", ), } - partitioner = pace.util.TilePartitioner(layout) + partitioner = ndsl.util.TilePartitioner(layout) for rank in range(total_ranks): rank = numpy.asarray([rank]) state["rank"].view[numpy.unravel_index(rank, state["rank"].extent)] = rank @@ -105,7 +105,7 @@ def test_centered_state_one_item_per_rank_scatter_tile(layout, numpy): numpy.unravel_index(rank, state["rank_pos_i"].extent) ] = i - partitioner = pace.util.TilePartitioner(layout) + partitioner = ndsl.util.TilePartitioner(layout) tile_communicator_list = get_tile_communicator_list(partitioner) for communicator, rank_array in rank_scatter_results( tile_communicator_list, state["rank"] @@ -131,30 +131,30 @@ def test_centered_state_one_item_per_rank_with_halo_scatter_tile(layout, n_halo, extent = layout total_ranks = layout[0] * layout[1] state = { - "rank": pace.util.Quantity( + "rank": ndsl.util.Quantity( numpy.empty([layout[0] + 2 * n_halo, layout[1] + 2 * n_halo]), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="dimensionless", origin=(n_halo, n_halo), extent=extent, ), - "rank_pos_j": pace.util.Quantity( + "rank_pos_j": ndsl.util.Quantity( numpy.empty([layout[0] + 2 * n_halo, layout[1] + 2 * n_halo]), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="dimensionless", origin=(n_halo, n_halo), extent=extent, ), - "rank_pos_i": pace.util.Quantity( + "rank_pos_i": ndsl.util.Quantity( numpy.empty([layout[0] + 2 * n_halo, layout[1] + 2 * n_halo]), - dims=[pace.util.Y_DIM, pace.util.X_DIM], + dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], units="dimensionless", origin=(n_halo, n_halo), extent=extent, ), } - partitioner = pace.util.TilePartitioner(layout) + partitioner = ndsl.util.TilePartitioner(layout) for rank in range(total_ranks): rank = numpy.asarray([rank]) state["rank"].view[numpy.unravel_index(rank, state["rank"].extent)] = rank diff --git a/util/tests/test_tile_scatter_gather.py b/ndsl/tests/test_tile_scatter_gather.py similarity index 92% rename from util/tests/test_tile_scatter_gather.py rename to ndsl/tests/test_tile_scatter_gather.py index 39780edd..c9740706 100644 --- a/util/tests/test_tile_scatter_gather.py +++ b/ndsl/tests/test_tile_scatter_gather.py @@ -3,7 +3,7 @@ import pytest -import pace.util +import ndsl.util try: @@ -30,23 +30,23 @@ def n_tile_halo(request): @pytest.fixture(params=["x,y", "y,x", "xi,y", "x,y,z", "z,y,x", "y,z,x"]) def dims(request, fast): if request.param == "x,y": - return [pace.util.X_DIM, pace.util.Y_DIM] + return [ndsl.util.X_DIM, ndsl.util.Y_DIM] elif request.param == "y,x": if fast: pytest.skip("running in fast mode") else: - return [pace.util.Y_DIM, pace.util.X_DIM] + return [ndsl.util.Y_DIM, ndsl.util.X_DIM] elif request.param == "xi,y": - return [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM] + return [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM] elif request.param == "x,y,z": - return [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM] + return [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM] elif request.param == "z,y,x": if fast: pytest.skip("running in fast mode") else: - return [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM] + return [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM] elif request.param == "y,z,x": - return [pace.util.Y_DIM, pace.util.Z_DIM, pace.util.X_DIM] + return [ndsl.util.Y_DIM, ndsl.util.Z_DIM, ndsl.util.X_DIM] else: raise NotImplementedError() @@ -64,12 +64,12 @@ def time(): @pytest.fixture() def dim_lengths(layout): return { - pace.util.X_DIM: 2 * layout[1], - pace.util.X_INTERFACE_DIM: 2 * layout[1] + 1, - pace.util.Y_DIM: 2 * layout[0], - pace.util.Y_INTERFACE_DIM: 2 * layout[0] + 1, - pace.util.Z_DIM: 3, - pace.util.Z_INTERFACE_DIM: 4, + ndsl.util.X_DIM: 2 * layout[1], + ndsl.util.X_INTERFACE_DIM: 2 * layout[1] + 1, + ndsl.util.Y_DIM: 2 * layout[0], + ndsl.util.Y_INTERFACE_DIM: 2 * layout[0] + 1, + ndsl.util.Z_DIM: 3, + ndsl.util.Z_INTERFACE_DIM: 4, } @@ -80,9 +80,9 @@ def communicator_list(layout): return_list = [] for rank in range(total_ranks): return_list.append( - pace.util.TileCommunicator( - pace.util.testing.DummyComm(rank, total_ranks, shared_buffer), - pace.util.TilePartitioner(layout), + ndsl.util.TileCommunicator( + ndsl.util.testing.DummyComm(rank, total_ranks, shared_buffer), + ndsl.util.TilePartitioner(layout), ) ) return return_list @@ -105,7 +105,7 @@ def tile_quantity(dims, units, dim_lengths, tile_extent, n_tile_halo, numpy): def scattered_quantities(tile_quantity, layout, n_rank_halo, numpy): return_list = [] total_ranks = layout[0] * layout[1] - partitioner = pace.util.TilePartitioner(layout) + partitioner = ndsl.util.TilePartitioner(layout) for rank in range(total_ranks): # partitioner is tested in other tests, here we assume it works subtile_slice = partitioner.subtile_slice( @@ -138,10 +138,10 @@ def get_quantity(dims, units, extent, n_halo, numpy): shape = list(copy.deepcopy(extent)) origin = [0 for dim in dims] for i, dim in enumerate(dims): - if dim in pace.util.HORIZONTAL_DIMS: + if dim in ndsl.util.HORIZONTAL_DIMS: origin[i] += n_halo shape[i] += 2 * n_halo - return pace.util.Quantity( + return ndsl.util.Quantity( numpy.zeros(shape), dims, units, diff --git a/util/tests/test_timer.py b/ndsl/tests/test_timer.py similarity index 99% rename from util/tests/test_timer.py rename to ndsl/tests/test_timer.py index 0065bcc1..5b589dc6 100644 --- a/util/tests/test_timer.py +++ b/ndsl/tests/test_timer.py @@ -2,7 +2,7 @@ import pytest -from pace.util import NullTimer, Timer +from ndsl.util import NullTimer, Timer @pytest.fixture diff --git a/util/tests/test_zarr_monitor.py b/ndsl/tests/test_zarr_monitor.py similarity index 88% rename from util/tests/test_zarr_monitor.py rename to ndsl/tests/test_zarr_monitor.py index b02ae454..da71e5bb 100644 --- a/util/tests/test_zarr_monitor.py +++ b/ndsl/tests/test_zarr_monitor.py @@ -12,11 +12,11 @@ import cftime import pytest -import pace.util -from pace.util import X_DIMS, Y_DIMS -from pace.util._optional_imports import xarray as xr -from pace.util.monitor.zarr_monitor import array_chunks, get_calendar -from pace.util.testing import DummyComm +import ndsl.util +from ndsl.util import X_DIMS, Y_DIMS +from ndsl.util._optional_imports import xarray as xr +from ndsl.util.monitor.zarr_monitor import array_chunks, get_calendar +from ndsl.util.testing import DummyComm requires_zarr = pytest.mark.skipif(zarr is None, reason="zarr is not installed") @@ -79,12 +79,12 @@ def layout(): @pytest.fixture def tile_partitioner(layout): - return pace.util.TilePartitioner(layout) + return ndsl.util.TilePartitioner(layout) @pytest.fixture def cube_partitioner(tile_partitioner): - return pace.util.CubedSpherePartitioner(tile_partitioner) + return ndsl.util.CubedSpherePartitioner(tile_partitioner) @pytest.fixture(params=["empty", "one_var_2d", "one_var_3d", "two_vars"]) @@ -93,7 +93,7 @@ def base_state(request, nz, ny, nx, numpy): return {} elif request.param == "one_var_2d": return { - "var1": pace.util.Quantity( + "var1": ndsl.util.Quantity( numpy.ones([ny, nx]), dims=("y", "x"), units="m", @@ -101,7 +101,7 @@ def base_state(request, nz, ny, nx, numpy): } elif request.param == "one_var_3d": return { - "var1": pace.util.Quantity( + "var1": ndsl.util.Quantity( numpy.ones([nz, ny, nx]), dims=("z", "y", "x"), units="m", @@ -109,12 +109,12 @@ def base_state(request, nz, ny, nx, numpy): } elif request.param == "two_vars": return { - "var1": pace.util.Quantity( + "var1": ndsl.util.Quantity( numpy.ones([ny, nx]), dims=("y", "x"), units="m", ), - "var2": pace.util.Quantity( + "var2": ndsl.util.Quantity( numpy.ones([nz, ny, nx]), dims=("z", "y", "x"), units="degK", @@ -140,7 +140,7 @@ def state_list(base_state, n_times, start_time, time_step, numpy): @requires_xarray def test_monitor_file_store(state_list, cube_partitioner, numpy, start_time): with tempfile.TemporaryDirectory(suffix=".zarr") as tempdir: - monitor = pace.util.ZarrMonitor(tempdir, cube_partitioner) + monitor = ndsl.util.ZarrMonitor(tempdir, cube_partitioner) for state in state_list: monitor.store(state) validate_store(state_list, tempdir, numpy, start_time) @@ -227,17 +227,17 @@ def test_monitor_file_store_multi_rank_state( nz, ny, nx = shape ny_rank = int(ny / layout[0] + ny_rank_add) nx_rank = int(nx / layout[1] + nx_rank_add) - grid = pace.util.TilePartitioner(layout) + grid = ndsl.util.TilePartitioner(layout) time = cftime.DatetimeJulian(2010, 6, 20, 6, 0, 0) timestep = timedelta(hours=1) total_ranks = 6 * layout[0] * layout[1] - partitioner = pace.util.CubedSpherePartitioner(grid) + partitioner = ndsl.util.CubedSpherePartitioner(grid) store = zarr.storage.DirectoryStore(tmpdir) shared_buffer = {} monitor_list = [] for rank in range(total_ranks): monitor_list.append( - pace.util.ZarrMonitor( + ndsl.util.ZarrMonitor( store, partitioner, "w", @@ -250,7 +250,7 @@ def test_monitor_file_store_multi_rank_state( for rank in range(total_ranks): state = { "time": time + i_t * timestep, - "var1": pace.util.Quantity( + "var1": ndsl.util.Quantity( numpy.ones([nz, ny_rank, nx_rank]), dims=dims, units=units, @@ -269,25 +269,25 @@ def test_monitor_file_store_multi_rank_state( pytest.param( (1, 1), (7, 6, 6), - [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (7, 6, 6), id="single_chunk_tile_3d", ), pytest.param( (1, 1), (6, 6), - [pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.X_DIM], (6, 6), id="single_chunk_tile_2d", ), - pytest.param((1, 1), (6,), [pace.util.Y_DIM], (6,), id="single_chunk_tile_1d"), + pytest.param((1, 1), (6,), [ndsl.util.Y_DIM], (6,), id="single_chunk_tile_1d"), pytest.param( (1, 1), (7, 6, 6), [ - pace.util.Z_DIM, - pace.util.Y_INTERFACE_DIM, - pace.util.X_INTERFACE_DIM, + ndsl.util.Z_DIM, + ndsl.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, ], (7, 5, 5), id="single_chunk_tile_3d_interfaces", @@ -295,14 +295,14 @@ def test_monitor_file_store_multi_rank_state( pytest.param( (2, 2), (7, 6, 6), - [pace.util.Z_DIM, pace.util.Y_DIM, pace.util.X_DIM], + [ndsl.util.Z_DIM, ndsl.util.Y_DIM, ndsl.util.X_DIM], (7, 3, 3), id="2_by_2_tile_3d", ), pytest.param( (2, 2), (6, 16, 6), - [pace.util.Y_DIM, pace.util.Z_DIM, pace.util.X_DIM], + [ndsl.util.Y_DIM, ndsl.util.Z_DIM, ndsl.util.X_DIM], (3, 16, 3), id="2_by_2_tile_3d_odd_dim_order", ), @@ -310,9 +310,9 @@ def test_monitor_file_store_multi_rank_state( (2, 2), (7, 7, 7), [ - pace.util.Z_DIM, - pace.util.Y_INTERFACE_DIM, - pace.util.X_INTERFACE_DIM, + ndsl.util.Z_DIM, + ndsl.util.Y_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, ], (7, 3, 3), id="2_by_2_tile_3d_interfaces", @@ -339,12 +339,11 @@ def _assert_no_nulls(dataset: "xr.Dataset"): @requires_zarr @requires_xarray def test_open_zarr_without_nans(cube_partitioner, numpy, backend, mask_and_scale): - store = {} # initialize store - monitor = pace.util.ZarrMonitor(store, cube_partitioner) - zero_quantity = pace.util.Quantity( + monitor = ndsl.util.ZarrMonitor(store, cube_partitioner) + zero_quantity = ndsl.util.Quantity( numpy.zeros([10, 10]), dims=("y", "x"), units="m" ) monitor.store({"var": zero_quantity}) @@ -363,8 +362,8 @@ def test_values_preserved(cube_partitioner, numpy): store = {} # initialize store - monitor = pace.util.ZarrMonitor(store, cube_partitioner) - quantity = pace.util.Quantity( + monitor = ndsl.util.ZarrMonitor(store, cube_partitioner) + quantity = ndsl.util.Quantity( numpy.random.uniform(size=(10, 10)), dims=dims, units=units ) monitor.store({"var": quantity}) @@ -398,7 +397,7 @@ def test_monitor_file_store_inconsistent_calendars( state_list_with_inconsistent_calendars, cube_partitioner, numpy ): with tempfile.TemporaryDirectory(suffix=".zarr") as tempdir: - monitor = pace.util.ZarrMonitor(tempdir, cube_partitioner) + monitor = ndsl.util.ZarrMonitor(tempdir, cube_partitioner) initial_state, final_state = state_list_with_inconsistent_calendars monitor.store(initial_state) with pytest.raises(ValueError, match="Calendar type"): @@ -416,7 +415,7 @@ def test_monitor_file_store_inconsistent_calendars( ) def diag(request, numpy): dims = request.param - diag = pace.util.Quantity( + diag = ndsl.util.Quantity( numpy.ones([size + 2 for size in range(len(dims))]), dims=dims, units="m" ) return diag @@ -438,18 +437,17 @@ def zarr_store(tmpdir_factory): @pytest.fixture(scope="function") def zarr_monitor_single_rank(zarr_store, cube_partitioner): - return pace.util.ZarrMonitor(zarr_store, cube_partitioner) + return ndsl.util.ZarrMonitor(zarr_store, cube_partitioner) @requires_zarr @requires_xarray def test_transposed_diags_write_across_ranks(diag, cube_partitioner, zarr_store): - layout = (1, 1) total_ranks = 6 * layout[0] * layout[1] shared_buffer = {} for rank in range(total_ranks): - monitor = pace.util.ZarrMonitor( + monitor = ndsl.util.ZarrMonitor( zarr_store, cube_partitioner, mpi_comm=DummyComm( @@ -471,7 +469,6 @@ def test_transposed_diags_write_across_ranks(diag, cube_partitioner, zarr_store) @requires_zarr @requires_xarray def test_transposed_diags_write_across_timesteps(diag, zarr_monitor_single_rank): - # verify that we can store transposed diags across time time_1 = cftime.DatetimeJulian(2010, 6, 20, 6, 0, 0) diag_1 = _transpose( @@ -493,7 +490,7 @@ def test_diags_fail_different_dim_set(diag, numpy, zarr_monitor_single_rank): zarr_monitor_single_rank.store({"time": time_1, "a": diag}) new_dims = list(diag.dims) new_dims[-1] = "some_other_dim" - diag_2 = pace.util.Quantity( + diag_2 = ndsl.util.Quantity( numpy.ones([size + 2 for size in range(len(diag.dims))]), dims=new_dims, units="m", @@ -506,7 +503,6 @@ def test_diags_fail_different_dim_set(diag, numpy, zarr_monitor_single_rank): @requires_zarr @requires_xarray def test_diags_only_consistent_units_attrs_required(diag, zarr_monitor_single_rank): - time_1 = cftime.DatetimeJulian(2010, 6, 20, 6, 0, 0) time_2 = cftime.DatetimeJulian(2010, 6, 20, 6, 15, 0) time_3 = cftime.DatetimeJulian(2010, 6, 20, 6, 30, 0) @@ -514,6 +510,6 @@ def test_diags_only_consistent_units_attrs_required(diag, zarr_monitor_single_ra diag_2 = copy.deepcopy(diag) diag_2._attrs.update({"some_non_units_attrs": 9.0}) zarr_monitor_single_rank.store({"time": time_2, "a": diag_2}) - diag_3 = pace.util.Quantity(data=diag.values, dims=diag.dims, units="not_m") + diag_3 = ndsl.util.Quantity(data=diag.values, dims=diag.dims, units="not_m") with pytest.raises(ValueError): zarr_monitor_single_rank.store({"time": time_3, "a": diag_3}) diff --git a/physics/pace/physics/_config.py b/physics/pace/physics/_config.py index 4ce3715a..96ad37dc 100644 --- a/physics/pace/physics/_config.py +++ b/physics/pace/physics/_config.py @@ -4,7 +4,7 @@ import f90nml -from pace.util import MetaEnumStr, Namelist, NamelistDefaults +from ndsl.util import MetaEnumStr, Namelist, NamelistDefaults DEFAULT_INT = 0 diff --git a/physics/pace/physics/functions/microphysics_funcs.py b/physics/pace/physics/functions/microphysics_funcs.py index 6f1c5a51..050761f2 100644 --- a/physics/pace/physics/functions/microphysics_funcs.py +++ b/physics/pace/physics/functions/microphysics_funcs.py @@ -1,7 +1,7 @@ from gt4py.cartesian import gtscript from gt4py.cartesian.gtscript import exp, log, sqrt -import pace.util.constants as constants +import ndsl.util.constants as constants # Marshall-Palmer constants ### @@ -44,7 +44,6 @@ @gtscript.function def dim(x, y): - diff = x - y return diff if diff > 0.0 else 0.0 @@ -53,7 +52,6 @@ def dim(x, y): # Compute the saturated specific humidity @gtscript.function def wqs1(ta, den): - return ( constants.E00 * exp( @@ -69,7 +67,6 @@ def wqs1(ta, den): # Compute saturated specific humidity and its gradient @gtscript.function def wqs2(ta, den): - tmp = wqs1(ta, den) return tmp, tmp * (constants.DC_VAP + constants.LV0 / ta) / (constants.RVGAS * ta) @@ -78,12 +75,9 @@ def wqs2(ta, den): # Compute the saturated specific humidity @gtscript.function def iqs1(ta, den): - if ta < constants.TICE: - # Over ice between -160 degrees Celsius and 0 degrees Celsius if ta >= constants.T_SAT_MIN: - tmp = ( constants.E00 * exp( @@ -96,7 +90,6 @@ def iqs1(ta, den): ) / (constants.RVGAS * ta * den) else: - tmp = ( constants.E00 * exp( @@ -108,14 +101,11 @@ def iqs1(ta, den): ) ) / (constants.RVGAS * constants.T_SAT_MIN * den) else: - # Over water between 0 degrees Celsius and 102 degrees Celsius if ta <= constants.TICE + 102.0: - tmp = wqs1(ta, den) else: - tmp = wqs1(constants.TICE + 102.0, den) return tmp @@ -124,18 +114,14 @@ def iqs1(ta, den): # Compute the gradient of saturated specific humidity @gtscript.function def iqs2(ta, den): - tmp = iqs1(ta, den) if ta < constants.TICE: - # Over ice between -160 degrees Celsius and 0 degrees Celsius if ta >= constants.T_SAT_MIN: - dtmp = tmp * (constants.D2ICE + constants.LI2 / ta) / (constants.RVGAS * ta) else: - dtmp = ( tmp * (constants.D2ICE + constants.LI2 / constants.T_SAT_MIN) @@ -143,16 +129,13 @@ def iqs2(ta, den): ) else: - # Over water between 0 degrees Celsius and 102 degrees Celsius if ta <= constants.TICE + 102.0: - dtmp = ( tmp * (constants.DC_VAP + constants.LV0 / ta) / (constants.RVGAS * ta) ) else: - dtmp = ( tmp * (constants.DC_VAP + constants.LV0 / (constants.TICE + 102.0)) @@ -165,7 +148,6 @@ def iqs2(ta, den): # Accretion function @gtscript.function def acr3d(v1, v2, q1, q2, c, cac_ik, cac_i1k, cac_i2k, rho): - t1 = sqrt(q1 * rho) s1 = sqrt(q2 * rho) s2 = sqrt(s1) @@ -183,7 +165,6 @@ def acr3d(v1, v2, q1, q2, c, cac_ik, cac_i1k, cac_i2k, rho): # called) @gtscript.function def smlt(tc, dqs, qsrho, psacw, psacr, c_0, c_1, c_2, c_3, c_4, rho, rhofac): - return (c_0 * tc / rho - c_1 * dqs) * ( c_2 * sqrt(qsrho) + c_3 * qsrho ** 0.65625 * sqrt(rhofac) ) + c_4 * tc * (psacw + psacr) @@ -193,7 +174,6 @@ def smlt(tc, dqs, qsrho, psacw, psacr, c_0, c_1, c_2, c_3, c_4, rho, rhofac): # is called) @gtscript.function def gmlt(tc, dqs, qgrho, pgacw, pgacr, c_0, c_1, c_2, c_3, c_4, rho): - return (c_0 * tc / rho - c_1 * dqs) * ( c_2 * sqrt(qgrho) + c_3 * qgrho ** 0.6875 / rho ** 0.25 ) + c_4 * tc * (pgacw + pgacr) @@ -225,10 +205,8 @@ def revap_racc( den, denfac, ): - # Evaporation and accretion of rain for the first 1/2 time step if (tz > t_wfr) and (qr > QRMIN): - # Define heat capacity and latent heat coefficient lhl = lv00 + d0_vap * tz q_liq = ql + qr @@ -251,13 +229,10 @@ def revap_racc( # qsat must be < q_plus to activate accretion # Rain evaporation if (dqv > QVMIN) and (qsat > q_minus): - if qsat > q_plus: - dq = qsat - qpz else: - # q_minus < qsat < q_plus # dq == dqh if qsat == q_minus dq = 0.25 * (q_minus - qsat) ** 2 / dqh @@ -282,7 +257,6 @@ def revap_racc( # Accretion: pracc if (qr > QRMIN) and (ql > 1.0e-6) and (qsat < q_minus): - sink = dt * denfac * cracw * exp(0.95 * log(qr * den)) sink = sink / (1.0 + sink) * ql ql = ql - sink @@ -314,21 +288,17 @@ def fall_speed(log_10, qg, qi, ql, qs, tk, den): # Ice if const_vi: - vti = vi_fac else: - # Use deng and mace (2008, grl), which gives smaller fall speed # than hd90 formula vi0 = 0.01 * vi_fac if qi < THI: - vti = VF_MIN else: - tc = tk - tice """ THE LOG10 HAD TO BE TRANSFORMED DUE TO THE LOG10 @@ -346,33 +316,25 @@ def fall_speed(log_10, qg, qi, ql, qs, tk, den): # Snow if const_vs: - vts = vs_fac else: - if qs < THS: - vts = VF_MIN else: - vts = vs_fac * VCONS * rhof * exp(0.0625 * log(qs * den / NORMS)) vts = min(vs_max, max(VF_MIN, vts)) # Graupel if const_vg: - vtg = vg_fac else: - if qg < THG: - vtg = VF_MIN else: - vtg = vg_fac * VCONG * rhof * sqrt(sqrt(sqrt(qg * den / NORMG))) vtg = min(vg_max, max(VF_MIN, vtg)) @@ -384,27 +346,21 @@ def compute_rain_fspeed(no_fall, qrz, den): from __externals__ import const_vr, vr_fac, vr_max if no_fall == 1: - vtrz = VF_MIN r1 = 0.0 else: - # Fall speed of rain if const_vr: - vtrz = vr_fac else: - qden = qrz * den if qrz < THR: - vtrz = VR_MIN else: - vtrz = ( vr_fac * VCONR @@ -420,25 +376,20 @@ def compute_rain_fspeed(no_fall, qrz, den): def autoconv_no_subgrid_var( use_ccn, fac_rc, t_wfr, so3, dt_rain, qlz, qrz, tz, den, ccn, c_praut ): - # No subgrid variability qc0 = fac_rc * ccn if tz > t_wfr: - if use_ccn: - # ccn is formulted as ccn = ccn_surface * (den / den_surface) qc = qc0 else: - qc = qc0 / den dq = qlz - qc if dq > 0.0: - sink = min(dq, dt_rain * c_praut * den * exp(so3 * log(qlz))) qlz = qlz - sink qrz = qrz + sink @@ -450,21 +401,17 @@ def autoconv_no_subgrid_var( def autoconv_subgrid_var( use_ccn, fac_rc, t_wfr, so3, dt_rain, qlz, qrz, tz, den, ccn, c_praut, dl ): - qc0 = fac_rc * ccn if tz > t_wfr + DT_FR: - dl = min(max(1.0e-6, dl), 0.5 * qlz) # As in klein's gfdl am2 stratiform scheme (with subgrid variations) if use_ccn: - # ccn is formulted as ccn = ccn_surface * (den / den_surface) qc = qc0 else: - qc = qc0 / den dq = 0.5 * (qlz + dl - qc) @@ -472,7 +419,6 @@ def autoconv_subgrid_var( # dq = dl if qc == q_minus = ql - dl # dq = 0 if qc == q_plus = ql + dl if dq > 0.0: # q_plus > qc - # Revised continuous form: linearly decays # (with subgrid dl) to zero at qc == ql + dl sink = min(1.0, dq / dl) * dt_rain * c_praut * den * exp(so3 * log(qlz)) @@ -538,10 +484,8 @@ def subgrid_z_proc( tcp3 = lcpk + icpk * min(1.0, dim(tice, tz) / (tice - t_wfr)) if p1 >= P_MIN: - # Instant deposit all water vapor to cloud ice when temperature is super low if tz < constants.T_MIN: - sink = dim(1.0e-7, qvz) qvz = qvz - sink qiz = qiz + sink @@ -555,7 +499,6 @@ def subgrid_z_proc( qaz = qaz + 1.0 # Air fully saturated; 100% cloud cover else: - # Update heat capacity and latent heat coefficient lhl = lv00 + d0_vap * tz lhi = constants.LI00 + constants.DC_ICE * tz @@ -575,25 +518,21 @@ def subgrid_z_proc( ) if tin > t_sub + 6.0: - rh = qpz / iqs1(tin, den) if rh < rh_adj: # qpz / rh_adj < qs - tz = tin qvz = qpz qlz = 0.0 qiz = 0.0 if ((tin > t_sub + 6.0) and (rh >= rh_adj)) or (tin <= t_sub + 6.0): - # Cloud water < -- > vapor adjustment qsw, dwsdt = wqs2(tz, den) dq0 = qsw - qvz if dq0 > 0.0: - # Added ql factor to prevent the situation of high ql and low RH factor = min( 1.0, fac_l2v * (10.0 * dq0 / qsw) @@ -601,7 +540,6 @@ def subgrid_z_proc( evap = min(qlz, factor * dq0 / (1.0 + tcp3 * dwsdt)) else: # Condensate all excess vapor into cloud water - evap = dq0 / (1.0 + tcp3 * dwsdt) qvz = qvz + evap @@ -623,7 +561,6 @@ def subgrid_z_proc( dtmp = t_wfr - tz # [-40, -48] if (dtmp > 0.0) and (qlz > QCMIN): - sink = min(qlz, min(qlz * dtmp * 0.125, dtmp / icpk)) qlz = qlz - sink qiz = qiz + sink @@ -643,17 +580,14 @@ def subgrid_z_proc( # Bigg mechanism if fast_sat_adj: - dt_pisub = 0.5 * dts else: - dt_pisub = dts tc = tice - tz if (qlz > QRMIN) and (tc > 0.0): - sink = ( 3.3333e-10 * dts * (exp(0.66 * tc) - 1.0) * den * qlz * qlz ) @@ -679,14 +613,12 @@ def subgrid_z_proc( # Sublimation / deposition of ice if tz < tice: - qsi, dqsdt = iqs2(tz, den) dq = qvz - qsi sink = dq / (1.0 + tcpk * dqsdt) if qiz > QRMIN: - # - Eq 9, hong et al. 2004, mwr # - For a and b, see dudhia 1989: page 3103 eq (b7) and (b8) pidep = ( @@ -704,11 +636,9 @@ def subgrid_z_proc( ) else: - pidep = 0.0 if dq > 0.0: # Vapor -- > ice - tmp = tice - tz # The following should produce more ice at higher altitude @@ -716,7 +646,6 @@ def subgrid_z_proc( sink = min(sink, min(max(qi_crt - qiz, pidep), tmp / tcpk)) else: # Ice -- > vapor - pidep = pidep * min(1.0, dim(tz, t_sub) * 0.2) sink = max(pidep, max(sink, -qiz)) @@ -741,7 +670,6 @@ def subgrid_z_proc( # - Sublimation / deposition of snow # - This process happens for the whole temperature range if qsz > QRMIN: - qsi, dqsdt = iqs2(tz, den) qden = qsz * den @@ -757,17 +685,13 @@ def subgrid_z_proc( pssub = (qsi - qvz) * dts * pssub if pssub > 0.0: # qs -- > qv, sublimation - pssub = min(pssub * min(1.0, dim(tz, t_sub) * 0.2), qsz) else: - if tz > tice: - pssub = 0.0 # No deposition else: - pssub = max(pssub, max(dq, (tz - tice) / tcpk)) qsz = qsz - pssub @@ -790,27 +714,22 @@ def subgrid_z_proc( # Simplified 2-way grapuel sublimation-deposition mechanism if qgz > QRMIN: - qsi, dqsdt = iqs2(tz, den) dq = (qvz - qsi) / (1.0 + tcpk * dqsdt) pgsub = (qvz / qsi - 1.0) * qgz if pgsub > 0.0: # Deposition - if tz > tice: - pgsub = 0.0 else: - pgsub = min( min(fac_v2g * pgsub, 0.2 * dq), min(qlz + qrz, (tice - tz) / tcpk), ) else: # Sublimation - pgsub = max(fac_g2v * pgsub, dq) * min( 1.0, dim(tz, t_sub) * 0.1 ) @@ -835,7 +754,6 @@ def subgrid_z_proc( # Minimum evap of rain in dry environmental air if qrz > QCMIN: - qsw, dqsdt = wqs2(tz, den) sink = min(qrz, dim(rh_rain * qsw, qvz) / (1.0 + lcpk * dqsdt)) @@ -861,7 +779,6 @@ def subgrid_z_proc( # Compute cloud fraction # Combine water species if not do_qa: - if rad_snow: q_sol = qiz + qsz else: @@ -887,27 +804,22 @@ def subgrid_z_proc( """ t_wfr_tmp = t_wfr if tin <= t_wfr: - # Ice phase qstar = iqs1(tin, den) elif tin >= tice: - # Liquid phase qstar = wqs1(tin, den) else: - # Mixed phase qsi = iqs1(tin, den) qsw = wqs1(tin, den) if q_cond > 3.0e-6: - rqi = q_sol / q_cond else: - # Mostly liquid water q_cond (k) at # initial cloud development stage """ @@ -922,18 +834,15 @@ def subgrid_z_proc( # Assuming subgrid linear distribution in horizontal; this is # effectively a smoother for the binary cloud scheme if qpz > QRMIN: - # Partial cloudiness by pdf dq = max(QCMIN, h_var * qpz) q_plus = qpz + dq # Cloud free if qstar > q_plus q_minus = qpz - dq if qstar < q_minus: - qaz = qaz + 1.0 # Air fully saturated; 100% cloud cover elif (qstar < q_plus) and (q_cond > qc_crt): - qaz = qaz + (q_plus - qstar) / ( dq + dq ) # Partial cloud cover @@ -1021,34 +930,28 @@ def icloud_main( icpk = lhi / cvm if p1 >= P_MIN: - pgacr = 0.0 pgacw = 0.0 tc = tz - tice if tc >= 0.0: - # Melting of snow dqs0 = ces0 / p1 - qvz if qsz > QCMIN: - # psacw: accretion of cloud water by snow (only rate is used (for # snow melt) since tc > 0.) if qlz > QRMIN: - factor = denfac * csacw * exp(0.8125 * log(qsz * den)) psacw = factor / (1.0 + dts * factor) * qlz # Rate else: - psacw = 0.0 # psacr: accretion of rain by melted snow # pracs: accretion of snow by rain if qrz > QRMIN: - psacr = min( acr3d( vtsz, vtrz, qrz, qsz, csacr, acco_01, acco_11, acco_21, den @@ -1060,7 +963,6 @@ def icloud_main( ) else: - psacr = 0.0 pracs = 0.0 @@ -1106,10 +1008,8 @@ def icloud_main( # Melting of graupel if (qgz > QCMIN) and (tc > 0.0): - # pgacr: accretion of rain by graupel if qrz > QRMIN: - pgacr = min( acr3d( vtgz, vtrz, qrz, qgz, cgacr, acco_02, acco_12, acco_22, den @@ -1121,7 +1021,6 @@ def icloud_main( qden = qgz * den if qlz > QRMIN: - factor = cgacw * qden / sqrt(den * sqrt(sqrt(qden))) pgacw = factor / (1.0 + dts * factor) * qlz # Rate @@ -1153,13 +1052,10 @@ def icloud_main( tz = tz - pgmlt * lhi / cvm else: - # Cloud ice proc # psaci: accretion of cloud ice by snow if qiz > 3.0e-7: # Cloud ice sink terms - if qsz > 1.0e-7: - # sjl added (following lin eq. 23) the temperature dependency to # reduce accretion, use esi = exp(0.05 * tc) as in hong et al 2004 factor = ( @@ -1168,7 +1064,6 @@ def icloud_main( psaci = factor / (1.0 + factor) * qiz else: - psaci = 0.0 # pasut: autoconversion: cloud ice -- > snow @@ -1180,30 +1075,24 @@ def icloud_main( # - Assuming linear subgrid vertical distribution of cloud ice # - The mismatch computation following lin et al. 1994, mwr if const_vi: - tmp = fac_i2s else: - tmp = fac_i2s * exp(0.025 * tc) di = max(di, QRMIN) q_plus = qiz + di if q_plus > (qim + QRMIN): - if qim > (qiz - di): - dq = (0.25 * (q_plus - qim) ** 2) / di else: - dq = qiz - qim psaut = tmp * dq else: - psaut = 0.0 # sink is no greater than 75% of qi @@ -1213,7 +1102,6 @@ def icloud_main( # pgaci: accretion of cloud ice by graupel if qgz > 1.0e-6: - # - factor = dts * cgaci / sqrt (den (k)) * # exp (0.05 * tc + 0.875 * log (qg * den (k))) # - Simplified form: remove temp dependency & @@ -1228,19 +1116,16 @@ def icloud_main( tc = tz - tice if (qrz > 1e-7) and (tc < 0.0): - # - Sink terms to qr: psacr + pgfr # - Source terms to qs: psacr # - Source terms to qg: pgfr # psacr accretion of rain by snow if qsz > 1.0e-7: # If snow exists - psacr = dts * acr3d( vtsz, vtrz, qrz, qsz, csacr, acco_01, acco_11, acco_21, den ) else: - psacr = 0.0 # pgfr: rain freezing -- > graupel @@ -1279,23 +1164,19 @@ def icloud_main( # Graupel production terms if qsz > 1.0e-7: - # Accretion: snow -- > graupel if qgz > QRMIN: - sink = dts * acr3d( vtgz, vtsz, qsz, qgz, cgacs, acco_03, acco_13, acco_23, den ) else: - sink = 0.0 # Autoconversion snow -- > graupel qsm = qs0_crt / den if qsz > qsm: - factor = dts * 1.0e-3 * exp(0.09 * (tz - tice)) sink = sink + factor / (1.0 + factor) * (qsz - qsm) @@ -1304,21 +1185,17 @@ def icloud_main( qgz = qgz + sink if (qgz > 1.0e-7) and (tz < tice0): - # pgacw: accretion of cloud water by graupel if qlz > 1.0e-6: - qden = qgz * den factor = dts * cgacw * qden / sqrt(den * sqrt(sqrt(qden))) pgacw = factor / (1.0 + factor) * qlz else: - pgacw = 0.0 # pgacr: accretion of rain by graupel if qrz > 1.0e-6: - pgacr = min( dts * acr3d( @@ -1328,7 +1205,6 @@ def icloud_main( ) else: - pgacr = 0.0 sink = pgacr + pgacw diff --git a/physics/pace/physics/physics_state.py b/physics/pace/physics/physics_state.py index 83463998..9fcaa823 100644 --- a/physics/pace/physics/physics_state.py +++ b/physics/pace/physics/physics_state.py @@ -3,9 +3,9 @@ import xarray as xr -import pace.dsl.gt4py_utils as gt_utils -import pace.util -from pace.dsl.typing import Float +import ndsl.dsl.gt4py_utils as gt_utils +import ndsl.util +from ndsl.dsl.typing import Float from pace.physics.stencils.microphysics import MicrophysicsState from ._config import PHYSICS_PACKAGES @@ -13,287 +13,287 @@ @dataclass() class PhysicsState: - qvapor: pace.util.Quantity = field( + qvapor: ndsl.util.Quantity = field( metadata={ "name": "specific_humidity", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", } ) - qliquid: pace.util.Quantity = field( + qliquid: ndsl.util.Quantity = field( metadata={ "name": "cloud_water_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - qice: pace.util.Quantity = field( + qice: ndsl.util.Quantity = field( metadata={ "name": "cloud_ice_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - qrain: pace.util.Quantity = field( + qrain: ndsl.util.Quantity = field( metadata={ "name": "rain_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - qsnow: pace.util.Quantity = field( + qsnow: ndsl.util.Quantity = field( metadata={ "name": "snow_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - qgraupel: pace.util.Quantity = field( + qgraupel: ndsl.util.Quantity = field( metadata={ "name": "graupel_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - qo3mr: pace.util.Quantity = field( + qo3mr: ndsl.util.Quantity = field( metadata={ "name": "ozone_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - qsgs_tke: pace.util.Quantity = field( + qsgs_tke: ndsl.util.Quantity = field( metadata={ "name": "turbulent_kinetic_energy", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m**2/s**2", "intent": "inout", } ) - qcld: pace.util.Quantity = field( + qcld: ndsl.util.Quantity = field( metadata={ "name": "cloud_fraction", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "", "intent": "inout", } ) - pt: pace.util.Quantity = field( + pt: ndsl.util.Quantity = field( metadata={ "name": "air_temperature", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "degK", "intent": "inout", } ) - delp: pace.util.Quantity = field( + delp: ndsl.util.Quantity = field( metadata={ "name": "pressure_thickness_of_atmospheric_layer", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "Pa", "intent": "inout", } ) - delz: pace.util.Quantity = field( + delz: ndsl.util.Quantity = field( metadata={ "name": "vertical_thickness_of_atmospheric_layer", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m", "intent": "inout", } ) - ua: pace.util.Quantity = field( + ua: ndsl.util.Quantity = field( metadata={ "name": "eastward_wind", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", "intent": "inout", } ) - va: pace.util.Quantity = field( + va: ndsl.util.Quantity = field( metadata={ "name": "northward_wind", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", } ) - w: pace.util.Quantity = field( + w: ndsl.util.Quantity = field( metadata={ "name": "vertical_wind", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", "intent": "inout", } ) - omga: pace.util.Quantity = field( + omga: ndsl.util.Quantity = field( metadata={ "name": "vertical_pressure_velocity", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "Pa/s", "intent": "inout", } ) - physics_updated_specific_humidity: pace.util.Quantity = field( + physics_updated_specific_humidity: ndsl.util.Quantity = field( metadata={ "name": "physics_updated_specific_humidity", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", } ) - physics_updated_qliquid: pace.util.Quantity = field( + physics_updated_qliquid: ndsl.util.Quantity = field( metadata={ "name": "physics_updated_liquid_water_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - physics_updated_qice: pace.util.Quantity = field( + physics_updated_qice: ndsl.util.Quantity = field( metadata={ "name": "physics_updated_ice_water_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - physics_updated_qrain: pace.util.Quantity = field( + physics_updated_qrain: ndsl.util.Quantity = field( metadata={ "name": "physics_updated_rain_water_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - physics_updated_qsnow: pace.util.Quantity = field( + physics_updated_qsnow: ndsl.util.Quantity = field( metadata={ "name": "physics_updated_snow_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - physics_updated_qgraupel: pace.util.Quantity = field( + physics_updated_qgraupel: ndsl.util.Quantity = field( metadata={ "name": "physics_updated_graupel_mixing_ratio", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "kg/kg", "intent": "inout", } ) - physics_updated_cloud_fraction: pace.util.Quantity = field( + physics_updated_cloud_fraction: ndsl.util.Quantity = field( metadata={ "name": "physics_cloud_fraction", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "", "intent": "inout", } ) - physics_updated_pt: pace.util.Quantity = field( + physics_updated_pt: ndsl.util.Quantity = field( metadata={ "name": "physics_air_temperature", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "degK", "intent": "inout", } ) - physics_updated_ua: pace.util.Quantity = field( + physics_updated_ua: ndsl.util.Quantity = field( metadata={ "name": "physics_eastward_wind", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", "intent": "inout", } ) - physics_updated_va: pace.util.Quantity = field( + physics_updated_va: ndsl.util.Quantity = field( metadata={ "name": "physics_northward_wind", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", "intent": "inout", } ) - delprsi: pace.util.Quantity = field( + delprsi: ndsl.util.Quantity = field( metadata={ "name": "model_level_pressure_thickness_in_physics", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "Pa", "intent": "inout", } ) - phii: pace.util.Quantity = field( + phii: ndsl.util.Quantity = field( metadata={ "name": "interface_geopotential_height", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_INTERFACE_DIM], "units": "m", "intent": "inout", } ) - phil: pace.util.Quantity = field( + phil: ndsl.util.Quantity = field( metadata={ "name": "layer_geopotential_height", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m", "intent": "inout", } ) - dz: pace.util.Quantity = field( + dz: ndsl.util.Quantity = field( metadata={ "name": "geopotential_height_thickness", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m", "intent": "inout", } ) - wmp: pace.util.Quantity = field( + wmp: ndsl.util.Quantity = field( metadata={ "name": "layer_mean_vertical_velocity_microph", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "units": "m/s", "intent": "inout", } ) - prsi: pace.util.Quantity = field( + prsi: ndsl.util.Quantity = field( metadata={ "name": "interface_pressure", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_INTERFACE_DIM], "units": "Pa", "intent": "inout", } ) - prsik: pace.util.Quantity = field( + prsik: ndsl.util.Quantity = field( metadata={ "name": "log_interface_pressure", - "dims": [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_INTERFACE_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_INTERFACE_DIM], "units": "Pa", "intent": "inout", } ) - land: pace.util.Quantity = field( + land: ndsl.util.Quantity = field( metadata={ "name": "land_mask", - "dims": [pace.util.X_DIM, pace.util.Y_DIM], + "dims": [ndsl.util.X_DIM, ndsl.util.Y_DIM], "units": "-", "intent": "in", } ) - quantity_factory: InitVar[pace.util.QuantityFactory] + quantity_factory: InitVar[ndsl.util.QuantityFactory] schemes: InitVar[List[PHYSICS_PACKAGES]] def __post_init__( self, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, schemes: List[PHYSICS_PACKAGES], ): # storage for tendency variables not in PhysicsState if "GFS_microphysics" in [scheme.value for scheme in schemes]: tendency = quantity_factory.zeros( - [pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + [ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], "unknown", dtype=Float, ) @@ -342,15 +342,15 @@ def init_zeros( def init_from_storages( cls, storages: Mapping[str, Any], - sizer: pace.util.GridSizer, - quantity_factory: pace.util.QuantityFactory, + sizer: ndsl.util.GridSizer, + quantity_factory: ndsl.util.QuantityFactory, schemes: List[PHYSICS_PACKAGES], ) -> "PhysicsState": - inputs: Dict[str, pace.util.Quantity] = {} + inputs: Dict[str, ndsl.util.Quantity] = {} for _field in fields(cls): if "dims" in _field.metadata.keys(): dims = _field.metadata["dims"] - quantity = pace.util.Quantity( + quantity = ndsl.util.Quantity( storages[_field.name], dims, _field.metadata["units"], @@ -365,7 +365,7 @@ def xr_dataset(self): data_vars = {} for name, field_info in self.__dataclass_fields__.items(): if name not in ["quantity_factory", "schemes"]: - if issubclass(field_info.type, pace.util.Quantity): + if issubclass(field_info.type, ndsl.util.Quantity): dims = [ f"{dim_name}_{name}" for dim_name in field_info.metadata["dims"] ] diff --git a/physics/pace/physics/stencils/get_phi_fv3.py b/physics/pace/physics/stencils/get_phi_fv3.py index 192ccdab..76927d3b 100644 --- a/physics/pace/physics/stencils/get_phi_fv3.py +++ b/physics/pace/physics/stencils/get_phi_fv3.py @@ -1,7 +1,7 @@ from gt4py.cartesian.gtscript import BACKWARD, PARALLEL, computation, interval -from pace.dsl.typing import FloatField -from pace.util.constants import ZVIR +from ndsl.dsl.typing import FloatField +from ndsl.util.constants import ZVIR def get_phi_fv3( diff --git a/physics/pace/physics/stencils/get_prs_fv3.py b/physics/pace/physics/stencils/get_prs_fv3.py index 348a77b1..63af8ceb 100644 --- a/physics/pace/physics/stencils/get_prs_fv3.py +++ b/physics/pace/physics/stencils/get_prs_fv3.py @@ -1,7 +1,7 @@ from gt4py.cartesian.gtscript import PARALLEL, computation, interval -from pace.dsl.typing import FloatField -from pace.util.constants import ZVIR +from ndsl.dsl.typing import FloatField +from ndsl.util.constants import ZVIR def get_prs_fv3( diff --git a/physics/pace/physics/stencils/microphysics.py b/physics/pace/physics/stencils/microphysics.py index 064bc1c7..770d2989 100644 --- a/physics/pace/physics/stencils/microphysics.py +++ b/physics/pace/physics/stencils/microphysics.py @@ -11,14 +11,14 @@ sqrt, ) +import ndsl.util +import ndsl.util.constants as constants import pace.physics.functions.microphysics_funcs as functions -import pace.util -import pace.util.constants as constants -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ, Int -from pace.util import X_DIM, Y_DIM, Z_DIM -from pace.util.grid import GridData +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ, Int +from ndsl.util import X_DIM, Y_DIM, Z_DIM +from ndsl.util.grid import GridData from .._config import PhysicsConfig @@ -98,7 +98,6 @@ def fields_init( ) with computation(PARALLEL), interval(...): - # Initialize precipitation graupel = 0.0 rain = 0.0 @@ -108,12 +107,10 @@ def fields_init( # This is to prevent excessive build-up of cloud ice from # external sources if de_ice: - qio = qi - dt_in * qi_dt # Orginal qi before phys qin = max(qio, qi0_max) # Adjusted value if qi > qin: - qs = qs + qi - qin qi = qin @@ -167,26 +164,19 @@ def fields_init( v1 = v0 if prog_ccn: - # Convert #/cc to #/m^3 ccn = qn * 1.0e6 c_praut = cpaut * (ccn * functions.RHOR) ** (-1.0 / 3.0) else: - ccn = (ccn_l * land + ccn_o * (1.0 - land)) * 1.0e6 with computation(BACKWARD): - with interval(-1, None): - if not prog_ccn and use_ccn: - # ccn is formulted as ccn = ccn_surface * (den / den_surface) ccn = ccn * constants.RDGAS * tz / p1 with interval(0, -1): - if not prog_ccn and use_ccn: - # Propagate downwards previously computed values of ccn ccn = ccn[0, 0, +1] @@ -209,7 +199,6 @@ def fields_init( # Fix all negative water species if fix_negative: - # Define heat capacity and latent heat coefficient cvm = ( c_air @@ -224,19 +213,16 @@ def fields_init( # If cloud ice < 0, borrow from snow if qiz < 0.0: - qsz = qsz + qiz qiz = 0.0 # If snow < 0, borrow from graupel if qsz < 0.0: - qgz = qgz + qsz qsz = 0.0 # If graupel < 0, borrow from rain if qgz < 0.0: - qrz = qrz + qgz tz = tz - qgz * icpk # Heating qgz = 0.0 @@ -245,61 +231,47 @@ def fields_init( # If rain < 0, borrow from cloud water if qrz < 0.0: - qlz = qlz + qrz qrz = 0.0 # If cloud water < 0, borrow from water vapor if qlz < 0.0: - qvz = qvz + qlz tz = tz - qlz * lcpk # Heating qlz = 0.0 with computation(FORWARD), interval(1, None): - # Fix water vapor; borrow from below if fix_negative and (qvz[0, 0, -1] < 0.0): qvz[0, 0, 0] = qvz[0, 0, 0] + qvz[0, 0, -1] * dp1[0, 0, -1] / dp1[0, 0, 0] with computation(PARALLEL), interval(0, -1): - if fix_negative and (qvz < 0.0): qvz = 0.0 # Bottom layer; borrow from above with computation(PARALLEL): - with interval(-2, -1): - flag = 0 if fix_negative and (qvz[0, 0, +1] < 0.0) and (qvz > 0.0): - dq = min(-qvz[0, 0, +1] * dp1[0, 0, +1], qvz[0, 0, 0] * dp1[0, 0, 0]) flag = 1 with interval(-1, None): - flag = 0 if fix_negative and (qvz < 0.0) and (qvz[0, 0, -1] > 0.0): - dq = min(-qvz[0, 0, 0] * dp1[0, 0, 0], qvz[0, 0, -1] * dp1[0, 0, -1]) flag = 1 with computation(PARALLEL): - with interval(-2, -1): - if flag == 1: - qvz = qvz - dq / dp1 with interval(-1, None): - if flag == 1: - qvz = qvz + dq / dp1 @@ -355,18 +327,14 @@ def warm_rain( ) with computation(PARALLEL), interval(...): - if is_first: - # Define air density based on hydrostatical property if p_nonhydro: - dz1 = dz0 den = den0 # Dry air density remains the same denfac = sqrt(functions.SFCRHO / den) else: - dz1 = dz0 * tz / t0 # Hydrostatic balance den = den0 * dz0 / dz1 denfac = sqrt(functions.SFCRHO / den) @@ -378,52 +346,40 @@ def warm_rain( m1_rain = 0.0 with computation(FORWARD): - with interval(0, 1): - if qrz > functions.QRMIN: no_fall = 0 else: no_fall = 1 with interval(1, None): - if no_fall[0, 0, -1] == 1: - if qrz > functions.QRMIN: no_fall = 0 else: no_fall = 1 else: - no_fall = 0 with computation(BACKWARD), interval(0, -1): - if no_fall[0, 0, +1] == 0: no_fall = no_fall[0, 0, +1] with computation(PARALLEL), interval(...): - vtrz, r1 = functions.compute_rain_fspeed(no_fall, qrz, den) with computation(BACKWARD): - with interval(-1, None): - if no_fall == 0: ze = zs - dz1 with interval(0, -1): - if no_fall == 0: ze = ze[0, 0, +1] - dz1 # dz < 0 with computation(PARALLEL), interval(...): - if no_fall == 0: - # Evaporation and accretion of rain for the first 1/2 time step qgz, qiz, qlz, qrz, qsz, qvz, tz = functions.revap_racc( dt5, @@ -454,36 +410,27 @@ def warm_rain( # Mass flux induced by falling rain with computation(PARALLEL): - with interval(0, 1): - if use_ppm and (no_fall == 0): zt = ze with interval(1, -1): - if use_ppm and (no_fall == 0): zt = ze - dt5 * (vtrz[0, 0, -1] + vtrz) with interval(-1, None): - if use_ppm and (no_fall == 0): - zt = ze - dt5 * (vtrz[0, 0, -1] + vtrz) zt_kbot1 = zs - dt_rain * vtrz with computation(FORWARD): - with interval(1, -1): - if use_ppm and (no_fall[0, 0, -1] == 0) and (zt >= zt[0, 0, -1]): zt = zt[0, 0, -1] - functions.DZ_MIN_FLIP with interval(-1, None): - if use_ppm: - if (no_fall[0, 0, -1] == 0) and (zt >= zt[0, 0, -1]): zt = zt[0, 0, -1] - functions.DZ_MIN_FLIP @@ -491,81 +438,60 @@ def warm_rain( zt_kbot1 = zt - functions.DZ_MIN_FLIP with computation(BACKWARD), interval(0, -1): - if use_ppm and (no_fall == 0): zt_kbot1 = zt_kbot1[0, 0, +1] with computation(PARALLEL): - with interval(0, -1): - if (not use_ppm) and (no_fall == 0): dz = ze - ze[0, 0, +1] with interval(-1, None): - if (not use_ppm) and (no_fall == 0): dz = ze - zs with computation(PARALLEL), interval(...): - if (not use_ppm) and (no_fall == 0): - dd = dt_rain * vtrz qrz = qrz * dp1 # Sedimentation with computation(FORWARD): - with interval(0, 1): - if (not use_ppm) and (no_fall == 0): qm = qrz / (dz + dd) with interval(1, None): - if (not use_ppm) and (no_fall == 0): qm = (qrz[0, 0, 0] + dd[0, 0, -1] * qm[0, 0, -1]) / (dz + dd) with computation(PARALLEL), interval(...): - if (not use_ppm) and (no_fall == 0): - # qm is density at this stage qm = qm * dz # Output mass fluxes with computation(FORWARD): - with interval(0, 1): - if (not use_ppm) and (no_fall == 0): m1_rain = qrz - qm with interval(1, None): - if (not use_ppm) and (no_fall == 0): m1_rain = m1_rain[0, 0, -1] + qrz[0, 0, 0] - qm with computation(BACKWARD): - with interval(-1, None): - if (not use_ppm) and (no_fall == 0): r1 = m1_rain with interval(0, -1): - if (not use_ppm) and (no_fall == 0): r1 = r1[0, 0, +1] with computation(PARALLEL): - with interval(0, 1): - if no_fall == 0: - if not use_ppm: - # Update qrz = qm / dp1 @@ -574,17 +500,13 @@ def warm_rain( w = (dm * w + m1_rain * vtrz) / (dm - m1_rain) with interval(1, None): - if no_fall == 0: - if not use_ppm: - # Update qrz = qm / dp1 # Vertical velocity transportation during sedimentation if do_sedi_w: - w[0, 0, 0] = ( dm * w[0, 0, 0] - m1_rain[0, 0, -1] * vtrz[0, 0, -1] @@ -592,11 +514,8 @@ def warm_rain( ) / (dm + m1_rain[0, 0, -1] - m1_rain) # Heat transportation during sedimentation with computation(PARALLEL): - with interval(0, 1): - if do_sedi_heat and (no_fall == 0): - # Input q fields are dry mixing ratios, and dm is dry air mass dgz = -0.5 * constants.GRAV * dz1 cvn = dp1 * ( @@ -617,9 +536,7 @@ def warm_rain( tz = tz + m1_rain * dgz / tmp with interval(1, None): - if do_sedi_heat and (no_fall == 0): - # Input q fields are dry mixing ratios, and dm is dry air mass dgz = -0.5 * constants.GRAV * dz1 cvn = dp1 * ( @@ -631,9 +548,7 @@ def warm_rain( # Implicit algorithm with computation(FORWARD), interval(1, None): - if do_sedi_heat and (no_fall == 0): - tz[0, 0, 0] = ( (cvn + constants.C_LIQ * (m1_rain - m1_rain[0, 0, -1])) * tz[0, 0, 0] + m1_rain[0, 0, -1] * constants.C_LIQ * tz[0, 0, -1] @@ -641,9 +556,7 @@ def warm_rain( ) / (cvn + constants.C_LIQ * m1_rain) with computation(PARALLEL), interval(...): - if no_fall == 0: - # Evaporation and accretion of rain for the remaining 1/2 time step qgz, qiz, qlz, qrz, qsz, qvz, tz = functions.revap_racc( dt5, @@ -673,61 +586,46 @@ def warm_rain( # Auto-conversion assuming linear subgrid vertical distribution of # cloud water following lin et al. 1994, mwr if irain_f != 0: - qlz, qrz = functions.autoconv_no_subgrid_var( use_ccn, fac_rc, t_wfr, so3, dt_rain, qlz, qrz, tz, den, ccn, c_praut ) # With subgrid variability with computation(FORWARD): - with interval(0, 1): - if (irain_f == 0) and z_slope_liq: dl = 0.0 with interval(1, None): - if (irain_f == 0) and z_slope_liq: dq = 0.5 * (qlz[0, 0, 0] - qlz[0, 0, -1]) with computation(PARALLEL): - with interval(1, -1): - if (irain_f == 0) and z_slope_liq: - # Use twice the strength of the # positive definiteness limiter (lin et al 1994) dl = 0.5 * min(abs(dq + dq[0, 0, +1]), 0.5 * qlz[0, 0, 0]) if dq * dq[0, 0, +1] <= 0.0: - if dq > 0.0: # Local maximum - dl = min(dl, min(dq, -dq[0, 0, +1])) else: - dl = 0.0 with interval(-1, None): - if (irain_f == 0) and z_slope_liq: dl = 0.0 with computation(PARALLEL), interval(...): - if irain_f == 0: - if z_slope_liq: - # Impose a presumed background horizontal variability that is # proportional to the value itself dl = max(dl, max(functions.QVMIN, h_var * qlz)) else: - dl = max(functions.QVMIN, h_var * qlz) qlz, qrz = functions.autoconv_subgrid_var( @@ -748,11 +646,9 @@ def warm_rain( rain = rain + r1 if is_first: - m1 = m1 + m1_rain else: - m1 = m1 + m1_rain + m1_sol @@ -788,7 +684,6 @@ def sedimentation( from __externals__ import do_sedi_heat, do_sedi_w, ql_mlt, tice, use_ppm, vi_fac with computation(PARALLEL), interval(...): - # Sedimentation of cloud ice, snow, and graupel vtgz, vtiz, vtsz = functions.fall_speed(log_10, qgz, qiz, qlz, qsz, tz, den) @@ -808,40 +703,31 @@ def sedimentation( k0 removed to avoid having to introduce a k_idx field """ with computation(FORWARD): - with interval(0, 1): - if tz > tice: stop_k = 1 else: stop_k = 0 with interval(1, -1): - if stop_k[0, 0, -1] == 0: - if tz > tice: stop_k = 1 else: stop_k = 0 else: - stop_k = 1 with interval(-1, None): - stop_k = 1 with computation(PARALLEL), interval(...): - if stop_k == 1: - # Melting of cloud ice (before fall) tc = tz - tice if (qiz > functions.QCMIN) and (tc > 0.0): - sink = min(qiz, fac_imlt * tc / icpk) tmp = min(sink, functions.dim(ql_mlt, qlz)) qlz = qlz + tmp @@ -859,7 +745,6 @@ def sedimentation( tc = tz - tice with computation(PARALLEL), interval(0, -1): - # Turn off melting when cloud microphysics time step is small if dts < 60.0: stop_k = 0 @@ -868,84 +753,64 @@ def sedimentation( stop_k = 0 with computation(BACKWARD): - with interval(-1, None): - ze = zs - dz1 with interval(1, -1): - ze = ze[0, 0, +1] - dz1 # dz < 0 with interval(0, 1): - ze = ze[0, 0, +1] - dz1 # dz < 0 zt = ze with computation(PARALLEL), interval(...): - if stop_k == 1: - # Update capacity heat and latent heat coefficient lhi = constants.LI00 + constants.DC_ICE * tz icpk = lhi / cvm # Melting of falling cloud ice into rain with computation(FORWARD): - with interval(0, 1): - if qiz > functions.QRMIN: no_fall = 0 else: no_fall = 1 with interval(1, None): - if no_fall[0, 0, -1] == 1: - if qiz > functions.QRMIN: no_fall = 0 else: no_fall = 1 else: - no_fall = 0 with computation(BACKWARD), interval(0, -1): - if no_fall[0, 0, +1] == 0: no_fall = no_fall[0, 0, +1] with computation(PARALLEL), interval(...): - if (vi_fac < 1.0e-5) or (no_fall == 1): i1 = 0.0 with computation(PARALLEL): - with interval(1, -1): - if (vi_fac >= 1.0e-5) and (no_fall == 0): zt = ze - dt5 * (vtiz[0, 0, -1] + vtiz) with interval(-1, None): - if (vi_fac >= 1.0e-5) and (no_fall == 0): - zt = ze - dt5 * (vtiz[0, 0, -1] + vtiz) zt_kbot1 = zs - dts * vtiz with computation(FORWARD): - with interval(1, -1): - if (vi_fac >= 1.0e-5) and (no_fall[0, 0, -1] == 0) and (zt >= zt[0, 0, -1]): zt = zt[0, 0, -1] - functions.DZ_MIN_FLIP with interval(-1, None): - if (vi_fac >= 1.0e-5) and (no_fall[0, 0, -1] == 0) and (zt >= zt[0, 0, -1]): zt = zt[0, 0, -1] - functions.DZ_MIN_FLIP @@ -953,89 +818,66 @@ def sedimentation( zt_kbot1 = zt - functions.DZ_MIN_FLIP with computation(BACKWARD), interval(0, -1): - if (vi_fac >= 1.0e-5) and (no_fall == 0): zt_kbot1 = zt_kbot1[0, 0, +1] - functions.DZ_MIN_FLIP with computation(PARALLEL), interval(...): - if (vi_fac >= 1.0e-5) and (no_fall == 0): - if do_sedi_w: dm = dp1 * (1.0 + qvz + qlz + qrz + qiz + qsz + qgz) with computation(PARALLEL): - with interval(0, -1): - if (not use_ppm) and (vi_fac >= 1.0e-5) and (no_fall == 0): dz = ze - ze[0, 0, +1] with interval(-1, None): - if (not use_ppm) and (vi_fac >= 1.0e-5) and (no_fall == 0): dz = ze - zs with computation(PARALLEL), interval(...): - if (not use_ppm) and (vi_fac >= 1.0e-5) and (no_fall == 0): - dd = dts * vtiz qiz = qiz * dp1 # Sedimentation with computation(FORWARD): - with interval(0, 1): - if (not use_ppm) and (vi_fac >= 1.0e-5) and (no_fall == 0): qm = qiz / (dz + dd) with interval(1, None): - if (not use_ppm) and (vi_fac >= 1.0e-5) and (no_fall == 0): qm = (qiz[0, 0, 0] + dd[0, 0, -1] * qm[0, 0, -1]) / (dz + dd) with computation(PARALLEL), interval(...): - if (not use_ppm) and (vi_fac >= 1.0e-5) and (no_fall == 0): - # qm is density at this stage qm = qm * dz # Output mass fluxes with computation(FORWARD): - with interval(0, 1): - if (not use_ppm) and (vi_fac >= 1.0e-5) and (no_fall == 0): m1_sol = qiz - qm with interval(1, None): - if (not use_ppm) and (vi_fac >= 1.0e-5) and (no_fall == 0): m1_sol = m1_sol[0, 0, -1] + qiz[0, 0, 0] - qm with computation(BACKWARD): - with interval(-1, None): - if (not use_ppm) and (vi_fac >= 1.0e-5) and (no_fall == 0): i1 = m1_sol with interval(0, -1): - if (not use_ppm) and (vi_fac >= 1.0e-5) and (no_fall == 0): i1 = i1[0, 0, +1] with computation(PARALLEL): - with interval(0, 1): - if (vi_fac >= 1.0e-5) and (no_fall == 0): - if not use_ppm: - # Update qiz = qm / dp1 @@ -1044,16 +886,12 @@ def sedimentation( w = (dm * w + m1_sol * vtiz) / (dm - m1_sol) with interval(1, None): - if (vi_fac >= 1.0e-5) and (no_fall == 0): - if not use_ppm: - # Update qiz = qm / dp1 if do_sedi_w: - w[0, 0, 0] = ( dm * w[0, 0, 0] - m1_sol[0, 0, -1] * vtiz[0, 0, -1] @@ -1062,62 +900,48 @@ def sedimentation( # Melting of falling snow into rain with computation(FORWARD): - with interval(0, 1): - if qsz > functions.QRMIN: no_fall = 0 else: no_fall = 1 with interval(1, None): - if no_fall[0, 0, -1] == 1: - if qsz > functions.QRMIN: no_fall = 0 else: no_fall = 1 else: - no_fall = 0 with computation(BACKWARD), interval(0, -1): - if no_fall[0, 0, +1] == 0: no_fall = no_fall[0, 0, +1] with computation(PARALLEL), interval(...): - r1 = 0.0 if no_fall == 1: s1 = 0.0 with computation(PARALLEL): - with interval(1, -1): - if no_fall == 0: zt = ze - dt5 * (vtsz[0, 0, -1] + vtsz) with interval(-1, None): - if no_fall == 0: - zt = ze - dt5 * (vtsz[0, 0, -1] + vtsz) zt_kbot1 = zs - dts * vtsz with computation(FORWARD): - with interval(1, -1): - if (no_fall[0, 0, -1] == 0) and (zt >= zt[0, 0, -1]): zt = zt[0, 0, -1] - functions.DZ_MIN_FLIP with interval(-1, None): - if (no_fall[0, 0, -1] == 0) and (zt >= zt[0, 0, -1]): zt = zt[0, 0, -1] - functions.DZ_MIN_FLIP @@ -1125,89 +949,66 @@ def sedimentation( zt_kbot1 = zt - functions.DZ_MIN_FLIP with computation(BACKWARD), interval(0, -1): - if no_fall == 0: zt_kbot1 = zt_kbot1[0, 0, +1] - functions.DZ_MIN_FLIP with computation(PARALLEL), interval(...): - if no_fall == 0: - if do_sedi_w: dm = dp1 * (1.0 + qvz + qlz + qrz + qiz + qsz + qgz) with computation(PARALLEL): - with interval(0, -1): - if (not use_ppm) and (no_fall == 0): dz = ze - ze[0, 0, +1] with interval(-1, None): - if (not use_ppm) and (no_fall == 0): dz = ze - zs with computation(PARALLEL), interval(...): - if (not use_ppm) and (no_fall == 0): - dd = dts * vtsz qsz = qsz * dp1 # Sedimentation with computation(FORWARD): - with interval(0, 1): - if (not use_ppm) and (no_fall == 0): qm = qsz / (dz + dd) with interval(1, None): - if (not use_ppm) and (no_fall == 0): qm = (qsz[0, 0, 0] + dd[0, 0, -1] * qm[0, 0, -1]) / (dz + dd) with computation(PARALLEL), interval(...): - if (not use_ppm) and (no_fall == 0): - # qm is density at this stage qm = qm * dz # Output mass fluxes with computation(FORWARD): - with interval(0, 1): - if (not use_ppm) and (no_fall == 0): m1_tf = qsz - qm with interval(1, None): - if (not use_ppm) and (no_fall == 0): m1_tf = m1_tf[0, 0, -1] + qsz[0, 0, 0] - qm with computation(BACKWARD): - with interval(-1, None): - if (not use_ppm) and (no_fall == 0): s1 = m1_tf with interval(0, -1): - if (not use_ppm) and (no_fall == 0): s1 = s1[0, 0, +1] with computation(PARALLEL): - with interval(0, 1): - if no_fall == 0: - if not use_ppm: - # Update qsz = qm / dp1 @@ -1218,18 +1019,14 @@ def sedimentation( w = (dm * w + m1_tf * vtsz) / (dm - m1_tf) with interval(1, None): - if no_fall == 0: - if not use_ppm: - # Update qsz = qm / dp1 m1_sol = m1_sol + m1_tf if do_sedi_w: - w[0, 0, 0] = ( dm * w[0, 0, 0] - m1_tf[0, 0, -1] * vtsz[0, 0, -1] @@ -1238,60 +1035,46 @@ def sedimentation( # Melting of falling graupel into rain with computation(FORWARD): - with interval(0, 1): - if qgz > functions.QRMIN: no_fall = 0 else: no_fall = 1 with interval(1, None): - if no_fall[0, 0, -1] == 1: - if qgz > functions.QRMIN: no_fall = 0 else: no_fall = 1 else: - no_fall = 0 with computation(BACKWARD), interval(0, -1): - if no_fall[0, 0, +1] == 0: no_fall = no_fall[0, 0, +1] with computation(PARALLEL), interval(...): - if no_fall == 1: g1 = 0.0 with computation(PARALLEL): - with interval(1, -1): - if no_fall == 0: zt = ze - dt5 * (vtgz[0, 0, -1] + vtgz) with interval(-1, None): - if no_fall == 0: - zt = ze - dt5 * (vtgz[0, 0, -1] + vtgz) zt_kbot1 = zs - dts * vtgz with computation(FORWARD): - with interval(1, -1): - if (no_fall[0, 0, -1] == 0) and (zt >= zt[0, 0, -1]): zt = zt[0, 0, -1] - functions.DZ_MIN_FLIP with interval(-1, None): - if (no_fall[0, 0, -1] == 0) and (zt >= zt[0, 0, -1]): zt = zt[0, 0, -1] - functions.DZ_MIN_FLIP @@ -1299,89 +1082,66 @@ def sedimentation( zt_kbot1 = zt - functions.DZ_MIN_FLIP with computation(BACKWARD), interval(0, -1): - if no_fall == 0: zt_kbot1 = zt_kbot1[0, 0, +1] - functions.DZ_MIN_FLIP with computation(PARALLEL), interval(...): - if no_fall == 0: - if do_sedi_w: dm = dp1 * (1.0 + qvz + qlz + qrz + qiz + qsz + qgz) with computation(PARALLEL): - with interval(0, -1): - if (not use_ppm) and (no_fall == 0): dz = ze - ze[0, 0, +1] with interval(-1, None): - if (not use_ppm) and (no_fall == 0): dz = ze - zs with computation(PARALLEL), interval(...): - if (not use_ppm) and (no_fall == 0): - dd = dts * vtgz qgz = qgz * dp1 # Sedimentation with computation(FORWARD): - with interval(0, 1): - if (not use_ppm) and (no_fall == 0): qm = qgz / (dz + dd) with interval(1, None): - if (not use_ppm) and (no_fall == 0): qm = (qgz[0, 0, 0] + dd[0, 0, -1] * qm[0, 0, -1]) / (dz + dd) with computation(PARALLEL), interval(...): - if (not use_ppm) and (no_fall == 0): - # qm is density at this stage qm = qm * dz # Output mass fluxes with computation(FORWARD): - with interval(0, 1): - if (not use_ppm) and (no_fall == 0): m1_tf = qgz - qm with interval(1, None): - if (not use_ppm) and (no_fall == 0): m1_tf = m1_tf[0, 0, -1] + qgz[0, 0, 0] - qm with computation(BACKWARD): - with interval(-1, None): - if (not use_ppm) and (no_fall == 0): g1 = m1_tf with interval(0, -1): - if (not use_ppm) and (no_fall == 0): g1 = g1[0, 0, +1] with computation(PARALLEL): - with interval(0, 1): - if no_fall == 0: - if not use_ppm: - # Update qgz = qm / dp1 @@ -1392,18 +1152,14 @@ def sedimentation( w = (dm * w + m1_tf * vtgz) / (dm - m1_tf) with interval(1, None): - if no_fall == 0: - if not use_ppm: - # Update qgz = qm / dp1 m1_sol = m1_sol + m1_tf if do_sedi_w: - w[0, 0, 0] = ( dm * w[0, 0, 0] - m1_tf[0, 0, -1] * vtgz[0, 0, -1] @@ -1411,7 +1167,6 @@ def sedimentation( ) / (dm + m1_tf[0, 0, -1] - m1_tf) with computation(PARALLEL), interval(...): - rain = rain + r1 # From melted snow and ice that reached the ground snow = snow + s1 graupel = graupel + g1 @@ -1419,11 +1174,8 @@ def sedimentation( # Heat transportation during sedimentation with computation(PARALLEL): - with interval(0, 1): - if do_sedi_heat: - # Input q fields are dry mixing ratios, and dm is dry air mass dgz = -0.5 * constants.GRAV * dz1 cvn = dp1 * ( @@ -1444,9 +1196,7 @@ def sedimentation( tz = tz + m1_sol * dgz / tmp with interval(1, None): - if do_sedi_heat: - # Input q fields are dry mixing ratios, and dm is dry air mass dgz = -0.5 * constants.GRAV * dz1 cvn = dp1 * ( @@ -1458,9 +1208,7 @@ def sedimentation( # Implicit algorithm with computation(FORWARD), interval(1, None): - if do_sedi_heat: - tz[0, 0, 0] = ( (cvn + constants.C_ICE * (m1_sol - m1_sol[0, 0, -1])) * tz[0, 0, 0] + m1_sol[0, 0, -1] * constants.C_ICE * tz[0, 0, -1] @@ -1540,7 +1288,6 @@ def icloud( from __externals__ import qi_gen, qi_lim, ql_mlt, t_wfr, tice, z_slope_ice with computation(PARALLEL), interval(...): - # Ice-phase microphysics # Define heat capacity and latent heat coefficient @@ -1557,7 +1304,6 @@ def icloud( t_wfr_tmp = t_wfr if (tz > tice) and (qiz > functions.QCMIN): - # pimlt: instant melting of cloud ice melt = min(qiz, fac_imlt * (tz - tice) / icpk) tmp = min(melt, functions.dim(ql_mlt, qlz)) # Maximum ql amount @@ -1572,7 +1318,6 @@ def icloud( tz = tz - melt * lhi / cvm elif (tz < t_wfr) and (qlz > functions.QCMIN): - # - pihom: homogeneous freezing of cloud water into cloud ice # - This is the 1st occurence of liquid water freezing # in the split mp process @@ -1594,52 +1339,39 @@ def icloud( # Vertical subgrid variability with computation(FORWARD): - with interval(0, 1): - if z_slope_ice: di = 0.0 with interval(1, None): - if z_slope_ice: dq = 0.5 * (qiz[0, 0, 0] - qiz[0, 0, -1]) with computation(PARALLEL): - with interval(1, -1): - if z_slope_ice: - # Use twice the strength of the # positive definiteness limiter (lin et al 1994) di = 0.5 * min(abs(dq + dq[0, 0, +1]), 0.5 * qiz[0, 0, 0]) if dq * dq[0, 0, +1] <= 0.0: - if dq > 0.0: # Local maximum - di = min(di, min(dq, -dq[0, 0, +1])) else: - di = 0.0 with interval(-1, None): - if z_slope_ice: di = 0.0 with computation(PARALLEL), interval(...): - if z_slope_ice: - # Impose a presumed background horizontal variability that is # proportional to the value itself di = max(di, max(functions.QVMIN, h_var * qiz)) else: - di = max(functions.QVMIN, h_var * qiz) qaz, qgz, qiz, qlz, qrz, qsz, qvz, tz = functions.icloud_main( @@ -1764,9 +1496,7 @@ def fields_update( # Momentum transportation during sedimentation (dp1 is dry mass; dp0 # is the old moist total mass) with computation(FORWARD), interval(1, None): - if sedi_transport: - u1[0, 0, 0] = (dp0[0, 0, 0] * u1[0, 0, 0] + m1[0, 0, -1] * u1[0, 0, -1]) / ( dp0[0, 0, 0] + m1[0, 0, -1] ) @@ -1775,14 +1505,11 @@ def fields_update( ) with computation(PARALLEL), interval(1, None): - if sedi_transport: - udt = udt + (u1 - u0) * rdt vdt = vdt + (v1 - v0) * rdt with computation(PARALLEL), interval(...): - # Update moist air mass (actually hydrostatic pressure) and convert # to dry mixing ratios omq = dp1 / dp0 @@ -1804,11 +1531,9 @@ def fields_update( # Update cloud fraction tendency if do_qa: - qa_dt = 0.0 else: - qa_dt = qa_dt + rdt * (qaz / ntimes - qa0) """ @@ -1846,24 +1571,24 @@ class MicrophysicsState: def __init__( self, - pt: pace.util.Quantity, - qvapor: pace.util.Quantity, - qliquid: pace.util.Quantity, - qrain: pace.util.Quantity, - qice: pace.util.Quantity, - qsnow: pace.util.Quantity, - qgraupel: pace.util.Quantity, - qcld: pace.util.Quantity, - ua: pace.util.Quantity, - va: pace.util.Quantity, - delp: pace.util.Quantity, - delz: pace.util.Quantity, - omga: pace.util.Quantity, - delprsi: pace.util.Quantity, - wmp: pace.util.Quantity, - dz: pace.util.Quantity, - tendency: pace.util.Quantity, - land: pace.util.Quantity, + pt: ndsl.util.Quantity, + qvapor: ndsl.util.Quantity, + qliquid: ndsl.util.Quantity, + qrain: ndsl.util.Quantity, + qice: ndsl.util.Quantity, + qsnow: ndsl.util.Quantity, + qgraupel: ndsl.util.Quantity, + qcld: ndsl.util.Quantity, + ua: ndsl.util.Quantity, + va: ndsl.util.Quantity, + delp: ndsl.util.Quantity, + delz: ndsl.util.Quantity, + omga: ndsl.util.Quantity, + delprsi: ndsl.util.Quantity, + wmp: ndsl.util.Quantity, + dz: ndsl.util.Quantity, + tendency: ndsl.util.Quantity, + land: ndsl.util.Quantity, ): self.pt = pt self.qvapor = qvapor @@ -1898,7 +1623,7 @@ class Microphysics: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, grid_data: GridData, namelist: PhysicsConfig, ): diff --git a/physics/pace/physics/stencils/physics.py b/physics/pace/physics/stencils/physics.py index 2de7d0a8..70002407 100644 --- a/physics/pace/physics/stencils/physics.py +++ b/physics/pace/physics/stencils/physics.py @@ -9,19 +9,18 @@ log, ) -import pace.util -import pace.util.constants as constants -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField +import ndsl.util +import ndsl.util.constants as constants +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField +from ndsl.util import X_DIM, Y_DIM, Z_DIM +from ndsl.util.grid import GridData +from pace.physics import PHYSICS_PACKAGES, PhysicsConfig from pace.physics.physics_state import PhysicsState from pace.physics.stencils.get_phi_fv3 import get_phi_fv3 from pace.physics.stencils.get_prs_fv3 import get_prs_fv3 from pace.physics.stencils.microphysics import Microphysics -from pace.util import X_DIM, Y_DIM, Z_DIM -from pace.util.grid import GridData - -from .._config import PHYSICS_PACKAGES, PhysicsConfig def atmos_phys_driver_statein( @@ -199,13 +198,13 @@ class Physics: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, grid_data: GridData, namelist: PhysicsConfig, ): schemes = [scheme.value for scheme in namelist.schemes] for scheme in schemes: - if scheme not in PHYSICS_PACKAGES: + if scheme not in PHYSICS_PACKAGES: # type: ignore raise NotImplementedError( f"{scheme} is not an implemented physics parameterization" ) @@ -275,7 +274,6 @@ def _setup_statein(self): self._p00 = 1.0e5 def __call__(self, physics_state: PhysicsState, timestep: float): - self._atmos_phys_driver_statein( self._prsik, physics_state.phii, diff --git a/stencils/pace/stencils/fv_update_phys.py b/physics/pace/physics/update/fv_update_phys.py similarity index 88% rename from stencils/pace/stencils/fv_update_phys.py rename to physics/pace/physics/update/fv_update_phys.py index fe027cd0..5c9fabd2 100644 --- a/stencils/pace/stencils/fv_update_phys.py +++ b/physics/pace/physics/update/fv_update_phys.py @@ -1,17 +1,17 @@ import gt4py.cartesian.gtscript as gtscript from gt4py.cartesian.gtscript import FORWARD, PARALLEL, computation, exp, interval, log -import pace.util -import pace.util.constants as constants +import ndsl.util +import ndsl.util.constants as constants +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.dace.wrapped_halo_exchange import WrappedHaloUpdater +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField, FloatFieldIJ +from ndsl.stencils.c2l_ord import CubedToLatLon +from ndsl.util import X_DIM, Y_DIM +from ndsl.util.grid import DriverGridData, GridData from pace import fv3core -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.dace.wrapped_halo_exchange import WrappedHaloUpdater -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField, FloatFieldIJ -from pace.stencils.c2l_ord import CubedToLatLon -from pace.stencils.update_dwind_phys import AGrid2DGridPhysics -from pace.util import X_DIM, Y_DIM -from pace.util.grid import DriverGridData, GridData +from pace.physics.update.update_dwind_phys import AGrid2DGridPhysics # TODO: This is the same as moist_cv.py in fv3core, should move to integration dir @@ -61,7 +61,6 @@ def update_pressure_and_surface_winds( u_srf: FloatFieldIJ, v_srf: FloatFieldIJ, ): - with computation(FORWARD), interval(1, None): pe = pe[0, 0, -1] + delp[0, 0, -1] with computation(PARALLEL), interval(1, None): @@ -84,14 +83,14 @@ class ApplyPhysicsToDycore: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, grid_data: GridData, namelist, - comm: pace.util.Communicator, + comm: ndsl.util.Communicator, grid_info: DriverGridData, state: fv3core.DycoreState, - u_dt: pace.util.Quantity, - v_dt: pace.util.Quantity, + u_dt: ndsl.util.Quantity, + v_dt: ndsl.util.Quantity, ): self._grid_type = grid_info.grid_type orchestrate( @@ -131,7 +130,7 @@ def __init__( origin = grid_indexing.origin_compute() shape = grid_indexing.max_shape full_3Dfield_1pts_halo_spec = quantity_factory.get_quantity_halo_spec( - dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], n_halo=1, ) self._udt_halo_updater = WrappedHaloUpdater( diff --git a/stencils/pace/stencils/update_atmos_state.py b/physics/pace/physics/update/update_atmos_state.py similarity index 95% rename from stencils/pace/stencils/update_atmos_state.py rename to physics/pace/physics/update/update_atmos_state.py index 789e40ea..28b177e4 100644 --- a/stencils/pace/stencils/update_atmos_state.py +++ b/physics/pace/physics/update/update_atmos_state.py @@ -2,14 +2,14 @@ from gt4py.cartesian.gtscript import BACKWARD, FORWARD, PARALLEL, computation, interval +import ndsl.util import pace.fv3core.stencils.fv_subgridz as fv_subgridz -import pace.util +from ndsl.dsl.dace.orchestration import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import Float, FloatField +from ndsl.util.grid import DriverGridData, GridData from pace import fv3core -from pace.dsl.dace.orchestration import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import Float, FloatField -from pace.stencils.fv_update_phys import ApplyPhysicsToDycore -from pace.util.grid import DriverGridData, GridData +from pace.physics.update.fv_update_phys import ApplyPhysicsToDycore # TODO: when this file is not importable from physics or fv3core, import @@ -17,9 +17,7 @@ def fill_gfs_delp(delp: FloatField, q: FloatField, q_min: Float): - with computation(BACKWARD): - with interval(0, -2): if q[0, 0, 1] < q_min: q = q[0, 0, 0] + (q[0, 0, 1] - q_min) * delp[0, 0, 1] / delp[0, 0, 0] @@ -149,7 +147,7 @@ class DycoreToPhysics: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, dycore_config: fv3core.DynamicalCoreConfig, do_dry_convective_adjust: bool, dycore_only: bool, @@ -163,9 +161,9 @@ def __init__( self._copy_dycore_to_physics = stencil_factory.from_dims_halo( copy_dycore_to_physics, compute_dims=[ - pace.util.X_INTERFACE_DIM, - pace.util.Y_INTERFACE_DIM, - pace.util.Z_INTERFACE_DIM, + ndsl.util.X_INTERFACE_DIM, + ndsl.util.Y_INTERFACE_DIM, + ndsl.util.Z_INTERFACE_DIM, ], compute_halos=(0, 0), ) @@ -242,10 +240,10 @@ def __init__( stencil_factory: StencilFactory, grid_data: GridData, namelist, - comm: pace.util.Communicator, + comm: ndsl.util.Communicator, grid_info: DriverGridData, state: fv3core.DycoreState, - quantity_factory: pace.util.QuantityFactory, + quantity_factory: ndsl.util.QuantityFactory, dycore_only: bool, apply_tendencies: bool, tendency_state, diff --git a/stencils/pace/stencils/update_dwind_phys.py b/physics/pace/physics/update/update_dwind_phys.py similarity index 98% rename from stencils/pace/stencils/update_dwind_phys.py rename to physics/pace/physics/update/update_dwind_phys.py index f5d3242d..4f990343 100644 --- a/stencils/pace/stencils/update_dwind_phys.py +++ b/physics/pace/physics/update/update_dwind_phys.py @@ -1,11 +1,11 @@ from gt4py.cartesian.gtscript import PARALLEL, computation, interval -import pace.util -from pace.dsl.dace import orchestrate -from pace.dsl.stencil import StencilFactory -from pace.dsl.typing import FloatField, FloatFieldI, FloatFieldIJ -from pace.util import X_DIM, Y_DIM, Z_DIM -from pace.util.grid import DriverGridData +import ndsl.util +from ndsl.dsl.dace import orchestrate +from ndsl.dsl.stencil import StencilFactory +from ndsl.dsl.typing import FloatField, FloatFieldI, FloatFieldIJ +from ndsl.util import X_DIM, Y_DIM, Z_DIM +from ndsl.util.grid import DriverGridData def set_winds_zero( @@ -170,8 +170,8 @@ class AGrid2DGridPhysics: def __init__( self, stencil_factory: StencilFactory, - quantity_factory: pace.util.QuantityFactory, - partitioner: pace.util.TilePartitioner, + quantity_factory: ndsl.util.QuantityFactory, + partitioner: ndsl.util.TilePartitioner, rank: int, namelist, grid_info: DriverGridData, diff --git a/physics/setup.py b/physics/setup.py index 785e96ee..0b7b4ebd 100755 --- a/physics/setup.py +++ b/physics/setup.py @@ -12,9 +12,7 @@ "f90nml>=1.1.0", "gt4py", "numpy", - "pace-util>=0.4.3", - "pace-stencils", - "pace-dsl", + "ndsl", "xarray", ] diff --git a/physics/tests/savepoint/conftest.py b/physics/tests/savepoint/conftest.py index 0c3956cf..2eeb1dcb 100644 --- a/physics/tests/savepoint/conftest.py +++ b/physics/tests/savepoint/conftest.py @@ -1,10 +1,10 @@ # This magical series of imports is to de-duplicate the conftest.py file # between the dycore and physics tests. We can avoid this if we refactor the tests # to all run from one directory -import pace.stencils.testing.conftest -from pace.stencils.testing.conftest import * # noqa: F403,F401 +import ndsl.stencils.testing.conftest +from ndsl.stencils.testing.conftest import * # noqa: F403,F401 from . import translate -pace.stencils.testing.conftest.translate = translate # type: ignore +ndsl.stencils.testing.conftest.translate = translate # type: ignore diff --git a/physics/tests/savepoint/test_translate.py b/physics/tests/savepoint/test_translate.py index 5550ff1f..8dadf15a 100644 --- a/physics/tests/savepoint/test_translate.py +++ b/physics/tests/savepoint/test_translate.py @@ -1 +1 @@ -from pace.stencils.testing.test_translate import * # noqa: F403,F401 +from ndsl.stencils.testing.test_translate import * # noqa: F403,F401 diff --git a/physics/tests/savepoint/translate/__init__.py b/physics/tests/savepoint/translate/__init__.py index bc2e9f0b..82a08c76 100644 --- a/physics/tests/savepoint/translate/__init__.py +++ b/physics/tests/savepoint/translate/__init__.py @@ -1,14 +1,11 @@ # flake8: noqa: F401 -from pace.stencils.testing.translate_update_dwind_phys import TranslateUpdateDWindsPhys - from .translate_atmos_phy_statein import TranslateAtmosPhysDriverStatein -from .translate_driver import TranslateDriver from .translate_fillgfs import TranslateFillGFS from .translate_fv_update_phys import TranslateFVUpdatePhys -from .translate_gfs_physics_driver import TranslateGFSPhysicsDriver from .translate_microphysics import TranslateMicroph from .translate_phifv3 import TranslatePhiFV3 from .translate_prsfv3 import TranslatePrsFV3 +from .translate_update_dwind_phys import TranslateUpdateDWindsPhys from .translate_update_pressure_sfc_winds_phys import ( TranslatePhysUpdatePressureSurfaceWinds, ) diff --git a/physics/tests/savepoint/translate/translate_atmos_phy_statein.py b/physics/tests/savepoint/translate/translate_atmos_phy_statein.py index f08c69bb..47005f20 100644 --- a/physics/tests/savepoint/translate/translate_atmos_phy_statein.py +++ b/physics/tests/savepoint/translate/translate_atmos_phy_statein.py @@ -1,9 +1,9 @@ import numpy as np +from translate_physics import TranslatePhysicsFortranData2Py -import pace.dsl.gt4py_utils as utils +import ndsl.dsl.gt4py_utils as utils +from ndsl.util.constants import KAPPA from pace.physics.stencils.physics import atmos_phys_driver_statein -from pace.stencils.testing.translate_physics import TranslatePhysicsFortranData2Py -from pace.util.constants import KAPPA class TranslateAtmosPhysDriverStatein(TranslatePhysicsFortranData2Py): diff --git a/physics/tests/savepoint/translate/translate_fillgfs.py b/physics/tests/savepoint/translate/translate_fillgfs.py index 50a1c142..ecd43655 100644 --- a/physics/tests/savepoint/translate/translate_fillgfs.py +++ b/physics/tests/savepoint/translate/translate_fillgfs.py @@ -1,9 +1,9 @@ import numpy as np +from translate_physics import TranslatePhysicsFortranData2Py -import pace.dsl.gt4py_utils as utils -from pace.stencils.testing.translate_physics import TranslatePhysicsFortranData2Py -from pace.stencils.update_atmos_state import fill_gfs_delp -from pace.util.utils import safe_assign_array +import ndsl.dsl.gt4py_utils as utils +from ndsl.util.utils import safe_assign_array +from pace.physics.update.update_atmos_state import fill_gfs_delp class TranslateFillGFS(TranslatePhysicsFortranData2Py): diff --git a/physics/tests/savepoint/translate/translate_fv_update_phys.py b/physics/tests/savepoint/translate/translate_fv_update_phys.py index 9d2fbeeb..f03822db 100644 --- a/physics/tests/savepoint/translate/translate_fv_update_phys.py +++ b/physics/tests/savepoint/translate/translate_fv_update_phys.py @@ -1,17 +1,17 @@ import dataclasses import numpy as np - -import pace.dsl -import pace.dsl.gt4py_utils as utils -import pace.util -from pace.dsl.typing import FloatField, FloatFieldIJ -from pace.stencils.fv_update_phys import ApplyPhysicsToDycore -from pace.stencils.testing.translate_physics import ( +from translate_physics import ( ParallelPhysicsTranslate2Py, transform_dwind_serialized_data, ) -from pace.util.utils import safe_assign_array + +import ndsl.dsl +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +from ndsl.dsl.typing import FloatField, FloatFieldIJ +from ndsl.util.utils import safe_assign_array +from pace.physics.update.fv_update_phys import ApplyPhysicsToDycore try: @@ -53,8 +53,8 @@ class TranslateFVUpdatePhys(ParallelPhysicsTranslate2Py): def __init__( self, grid, - namelist: pace.util.Namelist, - stencil_factory: pace.dsl.StencilFactory, + namelist: ndsl.util.Namelist, + stencil_factory: ndsl.dsl.StencilFactory, ): super().__init__(grid, namelist, stencil_factory) self.stencil_factory = stencil_factory @@ -173,9 +173,9 @@ def compute_parallel(self, inputs, communicator): tendencies = {} for key in ["u_dt", "v_dt", "t_dt"]: storage = inputs.pop(key) - tendencies[key] = pace.util.Quantity( + tendencies[key] = ndsl.util.Quantity( storage, - dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], units="test", origin=(0, 0, 0), extent=storage.shape, @@ -192,14 +192,14 @@ def compute_parallel(self, inputs, communicator): tendencies["u_dt"], tendencies["v_dt"], ) - dims_u = [pace.util.X_DIM, pace.util.Y_INTERFACE_DIM, pace.util.Z_DIM] + dims_u = [ndsl.util.X_DIM, ndsl.util.Y_INTERFACE_DIM, ndsl.util.Z_DIM] u_quantity = self.grid.make_quantity( state.u, dims=dims_u, origin=self.grid.sizer.get_origin(dims_u), extent=self.grid.sizer.get_extent(dims_u), ) - dims_v = [pace.util.X_INTERFACE_DIM, pace.util.Y_DIM, pace.util.Z_DIM] + dims_v = [ndsl.util.X_INTERFACE_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM] v_quantity = self.grid.make_quantity( state.v, dims=dims_v, diff --git a/physics/tests/savepoint/translate/translate_gfs_physics_driver.py b/physics/tests/savepoint/translate/translate_gfs_physics_driver.py index ab8f870b..e2e1a6b8 100644 --- a/physics/tests/savepoint/translate/translate_gfs_physics_driver.py +++ b/physics/tests/savepoint/translate/translate_gfs_physics_driver.py @@ -1,11 +1,12 @@ import copy -import pace.dsl.gt4py_utils as utils -import pace.util as util +from translate_physics import TranslatePhysicsFortranData2Py + +import ndsl.dsl.gt4py_utils as utils +import ndsl.util as util from pace.physics import PHYSICS_PACKAGES from pace.physics.stencils.physics import Physics, PhysicsState -from pace.stencils import update_atmos_state -from pace.stencils.testing.translate_physics import TranslatePhysicsFortranData2Py +from pace.physics.update import update_atmos_state class TranslateGFSPhysicsDriver(TranslatePhysicsFortranData2Py): diff --git a/physics/tests/savepoint/translate/translate_microphysics.py b/physics/tests/savepoint/translate/translate_microphysics.py index 49ebc4dc..fea7c7b1 100644 --- a/physics/tests/savepoint/translate/translate_microphysics.py +++ b/physics/tests/savepoint/translate/translate_microphysics.py @@ -1,14 +1,14 @@ import copy import numpy as np +from translate_physics import TranslatePhysicsFortranData2Py -import pace.dsl.gt4py_utils as utils -import pace.util -from pace.dsl.typing import Float +import ndsl.dsl.gt4py_utils as utils +import ndsl.util +from ndsl.dsl.typing import Float from pace.physics import PHYSICS_PACKAGES from pace.physics.stencils.microphysics import Microphysics from pace.physics.stencils.physics import PhysicsState -from pace.stencils.testing.translate_physics import TranslatePhysicsFortranData2Py class TranslateMicroph(TranslatePhysicsFortranData2Py): @@ -73,7 +73,7 @@ def compute(self, inputs): inputs["omga"] = copy.deepcopy(storage) inputs["prsi"] = copy.deepcopy(storage) inputs["prsik"] = copy.deepcopy(storage) - sizer = pace.util.SubtileGridSizer.from_tile_params( + sizer = ndsl.util.SubtileGridSizer.from_tile_params( nx_tile=self.namelist.npx - 1, ny_tile=self.namelist.npy - 1, nz=self.namelist.npz, @@ -82,7 +82,7 @@ def compute(self, inputs): layout=self.namelist.layout, ) - quantity_factory = pace.util.QuantityFactory.from_backend( + quantity_factory = ndsl.util.QuantityFactory.from_backend( sizer, self.stencil_factory.backend ) physics_state = PhysicsState.init_from_storages( diff --git a/physics/tests/savepoint/translate/translate_phifv3.py b/physics/tests/savepoint/translate/translate_phifv3.py index fb6e8877..34d1ef22 100644 --- a/physics/tests/savepoint/translate/translate_phifv3.py +++ b/physics/tests/savepoint/translate/translate_phifv3.py @@ -1,5 +1,6 @@ +from translate_physics import TranslatePhysicsFortranData2Py + from pace.physics.stencils.get_phi_fv3 import get_phi_fv3 -from pace.stencils.testing.translate_physics import TranslatePhysicsFortranData2Py class TranslatePhiFV3(TranslatePhysicsFortranData2Py): diff --git a/stencils/pace/stencils/testing/translate_physics.py b/physics/tests/savepoint/translate/translate_physics.py similarity index 97% rename from stencils/pace/stencils/testing/translate_physics.py rename to physics/tests/savepoint/translate/translate_physics.py index 1afdbb3f..f09f7a32 100644 --- a/stencils/pace/stencils/testing/translate_physics.py +++ b/physics/tests/savepoint/translate/translate_physics.py @@ -1,10 +1,10 @@ import numpy as np -import pace.dsl.gt4py_utils as utils -from pace.dsl.stencil import GridIndexing +import ndsl.dsl.gt4py_utils as utils +from ndsl.dsl.stencil import GridIndexing +from ndsl.stencils.testing.parallel_translate import ParallelTranslate2Py +from ndsl.stencils.testing.translate import TranslateFortranData2Py, as_numpy from pace.physics import PhysicsConfig -from pace.stencils.testing.parallel_translate import ParallelTranslate2Py -from pace.stencils.testing.translate import TranslateFortranData2Py, as_numpy def transform_dwind_serialized_data(data, grid_indexing: GridIndexing, backend: str): diff --git a/physics/tests/savepoint/translate/translate_prsfv3.py b/physics/tests/savepoint/translate/translate_prsfv3.py index 72b48d3d..71dad355 100644 --- a/physics/tests/savepoint/translate/translate_prsfv3.py +++ b/physics/tests/savepoint/translate/translate_prsfv3.py @@ -1,5 +1,6 @@ +from translate_physics import TranslatePhysicsFortranData2Py + from pace.physics.stencils.get_prs_fv3 import get_prs_fv3 -from pace.stencils.testing.translate_physics import TranslatePhysicsFortranData2Py class TranslatePrsFV3(TranslatePhysicsFortranData2Py): diff --git a/stencils/pace/stencils/testing/translate_update_dwind_phys.py b/physics/tests/savepoint/translate/translate_update_dwind_phys.py similarity index 84% rename from stencils/pace/stencils/testing/translate_update_dwind_phys.py rename to physics/tests/savepoint/translate/translate_update_dwind_phys.py index d7e7f847..4d1b0ef1 100644 --- a/stencils/pace/stencils/testing/translate_update_dwind_phys.py +++ b/physics/tests/savepoint/translate/translate_update_dwind_phys.py @@ -1,9 +1,9 @@ import numpy as np +from translate_physics import TranslatePhysicsFortranData2Py -import pace.util -from pace.stencils.testing.translate_physics import TranslatePhysicsFortranData2Py -from pace.stencils.update_dwind_phys import AGrid2DGridPhysics -from pace.util.utils import safe_assign_array +import ndsl.util +from ndsl.util.utils import safe_assign_array +from pace.physics.update.update_dwind_phys import AGrid2DGridPhysics class TranslateUpdateDWindsPhys(TranslatePhysicsFortranData2Py): @@ -24,7 +24,7 @@ def __init__(self, grid, namelist, stencil_factory): def compute(self, inputs): self.make_storage_data_input_vars(inputs) - partitioner = pace.util.TilePartitioner(self.namelist.layout) + partitioner = ndsl.util.TilePartitioner(self.namelist.layout) self.compute_func = AGrid2DGridPhysics( self.stencil_factory, self.grid.quantity_factory, diff --git a/physics/tests/savepoint/translate/translate_update_pressure_sfc_winds_phys.py b/physics/tests/savepoint/translate/translate_update_pressure_sfc_winds_phys.py index 58ffea1e..2e6c7319 100644 --- a/physics/tests/savepoint/translate/translate_update_pressure_sfc_winds_phys.py +++ b/physics/tests/savepoint/translate/translate_update_pressure_sfc_winds_phys.py @@ -1,6 +1,7 @@ -from pace.stencils.fv_update_phys import update_pressure_and_surface_winds -from pace.stencils.testing.translate_physics import TranslatePhysicsFortranData2Py -from pace.util.constants import KAPPA +from translate_physics import TranslatePhysicsFortranData2Py + +from ndsl.util.constants import KAPPA +from pace.physics.update.fv_update_phys import update_pressure_and_surface_winds class TranslatePhysUpdatePressureSurfaceWinds(TranslatePhysicsFortranData2Py): diff --git a/physics/tests/savepoint/translate/translate_update_tracers_phys.py b/physics/tests/savepoint/translate/translate_update_tracers_phys.py index d8e712ee..bc60b851 100644 --- a/physics/tests/savepoint/translate/translate_update_tracers_phys.py +++ b/physics/tests/savepoint/translate/translate_update_tracers_phys.py @@ -1,5 +1,6 @@ -from pace.stencils.testing.translate_physics import TranslatePhysicsFortranData2Py -from pace.stencils.update_atmos_state import prepare_tendencies_and_update_tracers +from translate_physics import TranslatePhysicsFortranData2Py + +from pace.physics.update.update_atmos_state import prepare_tendencies_and_update_tracers class TranslatePhysUpdateTracers(TranslatePhysicsFortranData2Py): diff --git a/requirements_dev.txt b/requirements_dev.txt index 4978ff36..1f153f0f 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -16,9 +16,7 @@ f90nml>=1.1.0 numpy>=1.15 -e external/gt4py -e external/dace --e stencils --e dsl +-e ndsl -e physics -e fv3core -e driver --e util diff --git a/stencils/setup.py b/stencils/setup.py deleted file mode 100644 index 539b3c18..00000000 --- a/stencils/setup.py +++ /dev/null @@ -1,36 +0,0 @@ -from typing import List - -from setuptools import find_namespace_packages, setup - - -setup_requirements: List[str] = [] - -requirements = ["gt4py", "pace-util", "pace-dsl"] - -test_requirements: List[str] = [] - - -setup( - author="Allen Institute for AI", - author_email="elynnw@allenai.org", - python_requires=">=3.8", - classifiers=[ - "Development Status :: 2 - Pre-Alpha", - "Intended Audience :: Developers", - "License :: OSI Approved :: BSD License", - "Natural Language :: English", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - ], - install_requires=requirements, - setup_requires=setup_requirements, - tests_require=test_requirements, - name="pace-stencils", - license="BSD license", - packages=find_namespace_packages(include=["pace.*"]), - include_package_data=True, - url="https://github.com/ai2cm/pace", - version="0.2.0", - zip_safe=False, -) diff --git a/tests/main/data/c12_restart/coupler.res b/tests/main/data/c12_restart/coupler.res new file mode 100644 index 00000000..c6722219 --- /dev/null +++ b/tests/main/data/c12_restart/coupler.res @@ -0,0 +1,3 @@ + 2 (Calendar: no_calendar=0, thirty_day_months=1, julian=2, gregorian=3, noleap=4) + 2016 8 1 0 0 0 Model start time: year, month, day, hour, minute, second + 2016 8 1 0 30 0 Current model time: year, month, day, hour, minute, second diff --git a/util/tests/data/c12_restart/fv_core.res.nc b/tests/main/data/c12_restart/fv_core.res.nc similarity index 100% rename from util/tests/data/c12_restart/fv_core.res.nc rename to tests/main/data/c12_restart/fv_core.res.nc diff --git a/util/tests/data/c12_restart/fv_core.res.tile1.nc b/tests/main/data/c12_restart/fv_core.res.tile1.nc similarity index 100% rename from util/tests/data/c12_restart/fv_core.res.tile1.nc rename to tests/main/data/c12_restart/fv_core.res.tile1.nc diff --git a/util/tests/data/c12_restart/fv_core.res.tile2.nc b/tests/main/data/c12_restart/fv_core.res.tile2.nc similarity index 100% rename from util/tests/data/c12_restart/fv_core.res.tile2.nc rename to tests/main/data/c12_restart/fv_core.res.tile2.nc diff --git a/util/tests/data/c12_restart/fv_core.res.tile3.nc b/tests/main/data/c12_restart/fv_core.res.tile3.nc similarity index 100% rename from util/tests/data/c12_restart/fv_core.res.tile3.nc rename to tests/main/data/c12_restart/fv_core.res.tile3.nc diff --git a/util/tests/data/c12_restart/fv_core.res.tile4.nc b/tests/main/data/c12_restart/fv_core.res.tile4.nc similarity index 100% rename from util/tests/data/c12_restart/fv_core.res.tile4.nc rename to tests/main/data/c12_restart/fv_core.res.tile4.nc diff --git a/util/tests/data/c12_restart/fv_core.res.tile5.nc b/tests/main/data/c12_restart/fv_core.res.tile5.nc similarity index 100% rename from util/tests/data/c12_restart/fv_core.res.tile5.nc rename to tests/main/data/c12_restart/fv_core.res.tile5.nc diff --git a/util/tests/data/c12_restart/fv_core.res.tile6.nc b/tests/main/data/c12_restart/fv_core.res.tile6.nc similarity index 100% rename from util/tests/data/c12_restart/fv_core.res.tile6.nc rename to tests/main/data/c12_restart/fv_core.res.tile6.nc diff --git a/util/tests/data/c12_restart/fv_srf_wnd.res.tile1.nc b/tests/main/data/c12_restart/fv_srf_wnd.res.tile1.nc similarity index 100% rename from util/tests/data/c12_restart/fv_srf_wnd.res.tile1.nc rename to tests/main/data/c12_restart/fv_srf_wnd.res.tile1.nc diff --git a/util/tests/data/c12_restart/fv_srf_wnd.res.tile2.nc b/tests/main/data/c12_restart/fv_srf_wnd.res.tile2.nc similarity index 100% rename from util/tests/data/c12_restart/fv_srf_wnd.res.tile2.nc rename to tests/main/data/c12_restart/fv_srf_wnd.res.tile2.nc diff --git a/util/tests/data/c12_restart/fv_srf_wnd.res.tile3.nc b/tests/main/data/c12_restart/fv_srf_wnd.res.tile3.nc similarity index 100% rename from util/tests/data/c12_restart/fv_srf_wnd.res.tile3.nc rename to tests/main/data/c12_restart/fv_srf_wnd.res.tile3.nc diff --git a/util/tests/data/c12_restart/fv_srf_wnd.res.tile4.nc b/tests/main/data/c12_restart/fv_srf_wnd.res.tile4.nc similarity index 100% rename from util/tests/data/c12_restart/fv_srf_wnd.res.tile4.nc rename to tests/main/data/c12_restart/fv_srf_wnd.res.tile4.nc diff --git a/util/tests/data/c12_restart/fv_srf_wnd.res.tile5.nc b/tests/main/data/c12_restart/fv_srf_wnd.res.tile5.nc similarity index 100% rename from util/tests/data/c12_restart/fv_srf_wnd.res.tile5.nc rename to tests/main/data/c12_restart/fv_srf_wnd.res.tile5.nc diff --git a/util/tests/data/c12_restart/fv_srf_wnd.res.tile6.nc b/tests/main/data/c12_restart/fv_srf_wnd.res.tile6.nc similarity index 100% rename from util/tests/data/c12_restart/fv_srf_wnd.res.tile6.nc rename to tests/main/data/c12_restart/fv_srf_wnd.res.tile6.nc diff --git a/util/tests/data/c12_restart/fv_tracer.res.tile1.nc b/tests/main/data/c12_restart/fv_tracer.res.tile1.nc similarity index 100% rename from util/tests/data/c12_restart/fv_tracer.res.tile1.nc rename to tests/main/data/c12_restart/fv_tracer.res.tile1.nc diff --git a/util/tests/data/c12_restart/fv_tracer.res.tile2.nc b/tests/main/data/c12_restart/fv_tracer.res.tile2.nc similarity index 100% rename from util/tests/data/c12_restart/fv_tracer.res.tile2.nc rename to tests/main/data/c12_restart/fv_tracer.res.tile2.nc diff --git a/util/tests/data/c12_restart/fv_tracer.res.tile3.nc b/tests/main/data/c12_restart/fv_tracer.res.tile3.nc similarity index 100% rename from util/tests/data/c12_restart/fv_tracer.res.tile3.nc rename to tests/main/data/c12_restart/fv_tracer.res.tile3.nc diff --git a/util/tests/data/c12_restart/fv_tracer.res.tile4.nc b/tests/main/data/c12_restart/fv_tracer.res.tile4.nc similarity index 100% rename from util/tests/data/c12_restart/fv_tracer.res.tile4.nc rename to tests/main/data/c12_restart/fv_tracer.res.tile4.nc diff --git a/util/tests/data/c12_restart/fv_tracer.res.tile5.nc b/tests/main/data/c12_restart/fv_tracer.res.tile5.nc similarity index 100% rename from util/tests/data/c12_restart/fv_tracer.res.tile5.nc rename to tests/main/data/c12_restart/fv_tracer.res.tile5.nc diff --git a/util/tests/data/c12_restart/fv_tracer.res.tile6.nc b/tests/main/data/c12_restart/fv_tracer.res.tile6.nc similarity index 100% rename from util/tests/data/c12_restart/fv_tracer.res.tile6.nc rename to tests/main/data/c12_restart/fv_tracer.res.tile6.nc diff --git a/util/tests/data/c12_restart/phy_data.tile1.nc b/tests/main/data/c12_restart/phy_data.tile1.nc similarity index 100% rename from util/tests/data/c12_restart/phy_data.tile1.nc rename to tests/main/data/c12_restart/phy_data.tile1.nc diff --git a/util/tests/data/c12_restart/phy_data.tile2.nc b/tests/main/data/c12_restart/phy_data.tile2.nc similarity index 100% rename from util/tests/data/c12_restart/phy_data.tile2.nc rename to tests/main/data/c12_restart/phy_data.tile2.nc diff --git a/util/tests/data/c12_restart/phy_data.tile3.nc b/tests/main/data/c12_restart/phy_data.tile3.nc similarity index 100% rename from util/tests/data/c12_restart/phy_data.tile3.nc rename to tests/main/data/c12_restart/phy_data.tile3.nc diff --git a/util/tests/data/c12_restart/phy_data.tile4.nc b/tests/main/data/c12_restart/phy_data.tile4.nc similarity index 100% rename from util/tests/data/c12_restart/phy_data.tile4.nc rename to tests/main/data/c12_restart/phy_data.tile4.nc diff --git a/util/tests/data/c12_restart/phy_data.tile5.nc b/tests/main/data/c12_restart/phy_data.tile5.nc similarity index 100% rename from util/tests/data/c12_restart/phy_data.tile5.nc rename to tests/main/data/c12_restart/phy_data.tile5.nc diff --git a/util/tests/data/c12_restart/phy_data.tile6.nc b/tests/main/data/c12_restart/phy_data.tile6.nc similarity index 100% rename from util/tests/data/c12_restart/phy_data.tile6.nc rename to tests/main/data/c12_restart/phy_data.tile6.nc diff --git a/util/tests/data/c12_restart/sfc_data.tile1.nc b/tests/main/data/c12_restart/sfc_data.tile1.nc similarity index 100% rename from util/tests/data/c12_restart/sfc_data.tile1.nc rename to tests/main/data/c12_restart/sfc_data.tile1.nc diff --git a/util/tests/data/c12_restart/sfc_data.tile2.nc b/tests/main/data/c12_restart/sfc_data.tile2.nc similarity index 100% rename from util/tests/data/c12_restart/sfc_data.tile2.nc rename to tests/main/data/c12_restart/sfc_data.tile2.nc diff --git a/util/tests/data/c12_restart/sfc_data.tile3.nc b/tests/main/data/c12_restart/sfc_data.tile3.nc similarity index 100% rename from util/tests/data/c12_restart/sfc_data.tile3.nc rename to tests/main/data/c12_restart/sfc_data.tile3.nc diff --git a/util/tests/data/c12_restart/sfc_data.tile4.nc b/tests/main/data/c12_restart/sfc_data.tile4.nc similarity index 100% rename from util/tests/data/c12_restart/sfc_data.tile4.nc rename to tests/main/data/c12_restart/sfc_data.tile4.nc diff --git a/util/tests/data/c12_restart/sfc_data.tile5.nc b/tests/main/data/c12_restart/sfc_data.tile5.nc similarity index 100% rename from util/tests/data/c12_restart/sfc_data.tile5.nc rename to tests/main/data/c12_restart/sfc_data.tile5.nc diff --git a/util/tests/data/c12_restart/sfc_data.tile6.nc b/tests/main/data/c12_restart/sfc_data.tile6.nc similarity index 100% rename from util/tests/data/c12_restart/sfc_data.tile6.nc rename to tests/main/data/c12_restart/sfc_data.tile6.nc diff --git a/tests/main/driver/test_diagnostics.py b/tests/main/driver/test_diagnostics.py index d332f168..eeccab4a 100644 --- a/tests/main/driver/test_diagnostics.py +++ b/tests/main/driver/test_diagnostics.py @@ -4,7 +4,6 @@ import yaml import pace.driver -import pace.dsl from pace.driver.run import main diff --git a/tests/main/driver/test_diagnostics_config.py b/tests/main/driver/test_diagnostics_config.py index f22c9179..fc57221f 100644 --- a/tests/main/driver/test_diagnostics_config.py +++ b/tests/main/driver/test_diagnostics_config.py @@ -2,6 +2,7 @@ import pytest +import ndsl.util import pace.driver import pace.driver.diagnostics from pace.fv3core.dycore_state import DycoreState @@ -41,8 +42,8 @@ def test_zselect_raises_error_if_not_3d(tmpdir): z_select=[pace.driver.diagnostics.ZSelect(level=0, names=["phis"])], ) result = config.diagnostics_factory(unittest.mock.MagicMock()) - quantity_factory = pace.util.QuantityFactory.from_backend( - sizer=pace.util.SubtileGridSizer( + quantity_factory = ndsl.util.QuantityFactory.from_backend( + sizer=ndsl.util.SubtileGridSizer( nx=12, ny=12, nz=79, n_halo=3, extra_dim_lengths={} ), backend="numpy", @@ -58,8 +59,8 @@ def test_zselect_raises_error_if_3rd_dim_not_z(tmpdir): z_select=[pace.driver.diagnostics.ZSelect(level=0, names=["foo"])], ) result = config.diagnostics_factory(unittest.mock.MagicMock()) - quantity_factory = pace.util.QuantityFactory.from_backend( - sizer=pace.util.SubtileGridSizer( + quantity_factory = ndsl.util.QuantityFactory.from_backend( + sizer=ndsl.util.SubtileGridSizer( nx=12, ny=12, nz=79, n_halo=3, extra_dim_lengths={} ), backend="numpy", diff --git a/tests/main/driver/test_driver.py b/tests/main/driver/test_driver.py index ad292e16..f46dabb5 100644 --- a/tests/main/driver/test_driver.py +++ b/tests/main/driver/test_driver.py @@ -4,8 +4,8 @@ import pytest -import pace.driver -import pace.dsl +import ndsl.dsl +from ndsl.util.null_comm import NullComm from pace.driver import CreatesCommSelector, DriverConfig, NullCommConfig from pace.driver.performance.report import ( TimeReport, @@ -13,7 +13,6 @@ gather_timing_data, get_sypd, ) -from pace.util.null_comm import NullComm def get_driver_config( @@ -35,7 +34,7 @@ def get_driver_config( else: initialization_config.start_time = datetime(2000, 1, 1) return DriverConfig( - stencil_config=pace.dsl.StencilConfig(), + stencil_config=ndsl.dsl.StencilConfig(), nx_tile=nx_tile, nz=nz, dt_atmos=dt_atmos, diff --git a/tests/main/driver/test_restart_fortran.py b/tests/main/driver/test_restart_fortran.py index 518ceed1..b0972c92 100644 --- a/tests/main/driver/test_restart_fortran.py +++ b/tests/main/driver/test_restart_fortran.py @@ -3,17 +3,17 @@ import numpy as np import xarray as xr +import ndsl.util import pace.driver -import pace.util -from pace.driver.initialization import FortranRestartInit -from pace.physics import PHYSICS_PACKAGES -from pace.util import ( +from ndsl.util import ( CubedSphereCommunicator, CubedSpherePartitioner, QuantityFactory, SubtileGridSizer, TilePartitioner, ) +from pace.driver.initialization import FortranRestartInit +from pace.physics import PHYSICS_PACKAGES DIR = os.path.dirname(os.path.abspath(__file__)) @@ -25,8 +25,8 @@ def test_state_from_fortran_restart(): partitioner = CubedSpherePartitioner(TilePartitioner(layout)) # need a local communicator to mock "scatter" for the restart data, # but need null communicator to handle grid initialization - local_comm = pace.util.LocalComm(rank=0, total_ranks=6, buffer_dict={}) - null_comm = pace.util.NullComm(rank=0, total_ranks=6) + local_comm = ndsl.util.LocalComm(rank=0, total_ranks=6, buffer_dict={}) + null_comm = ndsl.util.NullComm(rank=0, total_ranks=6) local_communicator = CubedSphereCommunicator(local_comm, partitioner) null_communicator = CubedSphereCommunicator(null_comm, partitioner) @@ -42,7 +42,7 @@ def test_state_from_fortran_restart(): ) quantity_factory = QuantityFactory.from_backend(sizer=sizer, backend="numpy") - restart_dir = os.path.join(PACE_DIR, "util/tests/data/c12_restart") + restart_dir = os.path.join(PACE_DIR, "tests/main/data/c12_restart") ( damping_coefficients, diff --git a/tests/main/driver/test_restart_serial.py b/tests/main/driver/test_restart_serial.py index 4c4542f5..a4baa02b 100644 --- a/tests/main/driver/test_restart_serial.py +++ b/tests/main/driver/test_restart_serial.py @@ -6,12 +6,13 @@ import xarray as xr import yaml -import pace.dsl +import ndsl.dsl +import pace.driver +from ndsl.util.null_comm import NullComm from pace.driver import CreatesComm, DriverConfig from pace.driver.driver import RestartConfig from pace.driver.initialization import AnalyticInit from pace.physics import PHYSICS_PACKAGES -from pace.util.null_comm import NullComm DIR = os.path.dirname(os.path.abspath(__file__)) @@ -49,11 +50,11 @@ def test_restart_save_to_disk(): driver_config = DriverConfig.from_dict(yaml.safe_load(f)) backend = "numpy" mpi_comm = NullComm(rank=0, total_ranks=6, fill_value=0.0) - partitioner = pace.util.CubedSpherePartitioner( - pace.util.TilePartitioner((1, 1)) + partitioner = ndsl.util.CubedSpherePartitioner( + ndsl.util.TilePartitioner((1, 1)) ) - communicator = pace.util.CubedSphereCommunicator(mpi_comm, partitioner) - sizer = pace.util.SubtileGridSizer.from_tile_params( + communicator = ndsl.util.CubedSphereCommunicator(mpi_comm, partitioner) + sizer = ndsl.util.SubtileGridSizer.from_tile_params( nx_tile=12, ny_tile=12, nz=79, @@ -63,7 +64,7 @@ def test_restart_save_to_disk(): tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, ) - quantity_factory = pace.util.QuantityFactory.from_backend( + quantity_factory = ndsl.util.QuantityFactory.from_backend( sizer=sizer, backend=backend ) @@ -98,7 +99,7 @@ def test_restart_save_to_disk(): f"RESTART/restart_dycore_state_{mpi_comm.rank}.nc" ) for var in driver_state.dycore_state.__dict__.keys(): - if isinstance(driver_state.dycore_state.__dict__[var], pace.util.Quantity): + if isinstance(driver_state.dycore_state.__dict__[var], ndsl.util.Quantity): np.testing.assert_allclose( driver_state.dycore_state.__dict__[var].data, restart_dycore[var].values, @@ -151,7 +152,7 @@ def test_restart_save_to_disk(): for var in driver_state.dycore_state.__dict__.keys(): before_restart = driver_state.dycore_state.__dict__[var] after_restart = restart_state.dycore_state.__dict__[var] - if isinstance(before_restart, pace.util.Quantity): + if isinstance(before_restart, ndsl.util.Quantity): np.testing.assert_allclose( before_restart.view[:], after_restart.view[:], diff --git a/tests/main/driver/test_safety_checks.py b/tests/main/driver/test_safety_checks.py index c42fd0c4..8b568830 100644 --- a/tests/main/driver/test_safety_checks.py +++ b/tests/main/driver/test_safety_checks.py @@ -3,8 +3,8 @@ import numpy as np import pytest +from ndsl.util import Quantity from pace.driver.safety_checks import SafetyChecker -from pace.util import Quantity def test_register_variable(): diff --git a/tests/main/dsl/test_caches.py b/tests/main/dsl/test_caches.py index c1f01303..85aeb329 100644 --- a/tests/main/dsl/test_caches.py +++ b/tests/main/dsl/test_caches.py @@ -2,16 +2,16 @@ from gt4py.cartesian.gtscript import PARALLEL, Field, computation, interval from gt4py.storage import empty, ones -import pace.dsl -from pace.dsl.dace import orchestrate -from pace.dsl.dace.dace_config import DaceConfig, DaCeOrchestration -from pace.dsl.stencil import CompilationConfig, GridIndexing +import ndsl.dsl +from ndsl.dsl.dace import orchestrate +from ndsl.dsl.dace.dace_config import DaceConfig, DaCeOrchestration +from ndsl.dsl.stencil import CompilationConfig, GridIndexing def _make_storage( func, grid_indexing, - stencil_config: pace.dsl.StencilConfig, + stencil_config: ndsl.dsl.StencilConfig, *, dtype=float, aligned_index=(0, 0, 0), @@ -40,12 +40,12 @@ def _build_stencil(backend, orchestrated: DaCeOrchestration): east_edge=True, ) - stencil_config = pace.dsl.StencilConfig( + stencil_config = ndsl.dsl.StencilConfig( compilation_config=CompilationConfig(backend=backend, rebuild=True), dace_config=DaceConfig(None, backend, 5, 5, orchestrated), ) - stencil_factory = pace.dsl.StencilFactory(stencil_config, grid_indexing) + stencil_factory = ndsl.dsl.StencilFactory(stencil_config, grid_indexing) built_stencil = stencil_factory.from_origin_domain( _stencil, (0, 0, 0), domain=grid_indexing.domain @@ -136,7 +136,7 @@ def test_relocatability(backend: str): import gt4py from gt4py.cartesian import config as gt_config - from pace.util.mpi import MPI + from ndsl.util.mpi import MPI # Restore original dir name gt4py.cartesian.config.cache_settings["dir_name"] = os.environ.get( diff --git a/tests/main/dsl/test_compilation_config.py b/tests/main/dsl/test_compilation_config.py index c78ccea7..fc3246b3 100644 --- a/tests/main/dsl/test_compilation_config.py +++ b/tests/main/dsl/test_compilation_config.py @@ -3,9 +3,9 @@ import pytest -from pace.dsl.stencil import CompilationConfig, RunMode -from pace.util.communicator import CubedSphereCommunicator -from pace.util.partitioner import CubedSpherePartitioner, TilePartitioner +from ndsl.dsl.stencil import CompilationConfig, RunMode +from ndsl.util.communicator import CubedSphereCommunicator +from ndsl.util.partitioner import CubedSpherePartitioner, TilePartitioner def test_safety_checks(): diff --git a/tests/main/dsl/test_dace_config.py b/tests/main/dsl/test_dace_config.py index cb3566dd..6955cf83 100644 --- a/tests/main/dsl/test_dace_config.py +++ b/tests/main/dsl/test_dace_config.py @@ -1,16 +1,16 @@ import unittest.mock -from pace.dsl.dace.dace_config import DaceConfig, _determine_compiling_ranks -from pace.dsl.dace.orchestration import ( +from ndsl.dsl.dace.dace_config import DaceConfig, _determine_compiling_ranks +from ndsl.dsl.dace.orchestration import ( DaCeOrchestration, orchestrate, orchestrate_function, ) -from pace.util.communicator import CubedSpherePartitioner, TilePartitioner +from ndsl.util.communicator import CubedSpherePartitioner, TilePartitioner """ -Tests that the dace configuration pace.dsl.dace.dace_config +Tests that the dace configuration ndsl.dsl.dace.dace_config which determines whether we use dace to run wrapped functions. """ @@ -26,7 +26,7 @@ def foo(): ) wrapped = orchestrate_function(config=dace_config)(foo) with unittest.mock.patch( - "pace.dsl.dace.orchestration._call_sdfg" + "ndsl.dsl.dace.orchestration._call_sdfg" ) as mock_call_sdfg: wrapped() assert mock_call_sdfg.called @@ -44,7 +44,7 @@ def foo(): ) wrapped = orchestrate_function(config=dace_config)(foo) with unittest.mock.patch( - "pace.dsl.dace.orchestration._call_sdfg" + "ndsl.dsl.dace.orchestration._call_sdfg" ) as mock_call_sdfg: wrapped() assert not mock_call_sdfg.called @@ -65,7 +65,7 @@ def foo(self): pass with unittest.mock.patch( - "pace.dsl.dace.orchestration._call_sdfg" + "ndsl.dsl.dace.orchestration._call_sdfg" ) as mock_call_sdfg: a = A() a.foo() @@ -87,7 +87,7 @@ def foo(self): pass with unittest.mock.patch( - "pace.dsl.dace.orchestration._call_sdfg" + "ndsl.dsl.dace.orchestration._call_sdfg" ) as mock_call_sdfg: a = A() a.foo() diff --git a/tests/main/dsl/test_skip_passes.py b/tests/main/dsl/test_skip_passes.py index 7cb4376f..3a7745fd 100644 --- a/tests/main/dsl/test_skip_passes.py +++ b/tests/main/dsl/test_skip_passes.py @@ -7,15 +7,15 @@ from gt4py.cartesian.gtc.passes.oir_pipeline import DefaultPipeline from gt4py.cartesian.gtscript import PARALLEL, computation, interval -from pace.dsl.dace.dace_config import DaceConfig -from pace.dsl.stencil import ( +from ndsl.dsl.dace.dace_config import DaceConfig +from ndsl.dsl.stencil import ( CompilationConfig, GridIndexing, StencilConfig, StencilFactory, ) -from pace.dsl.typing import FloatField -from pace.util import X_DIM, Y_DIM, Z_DIM +from ndsl.dsl.typing import FloatField +from ndsl.util import X_DIM, Y_DIM, Z_DIM def stencil_definition(a: FloatField): diff --git a/tests/main/dsl/test_stencil.py b/tests/main/dsl/test_stencil.py index eb17eddd..4080c5d3 100644 --- a/tests/main/dsl/test_stencil.py +++ b/tests/main/dsl/test_stencil.py @@ -1,14 +1,14 @@ from gt4py.cartesian.gtscript import PARALLEL, Field, computation, interval from gt4py.storage import empty, ones -import pace.dsl -from pace.dsl.stencil import CompilationConfig, GridIndexing +import ndsl.dsl +from ndsl.dsl.stencil import CompilationConfig, GridIndexing def _make_storage( func, grid_indexing, - stencil_config: pace.dsl.StencilConfig, + stencil_config: ndsl.dsl.StencilConfig, *, dtype=float, aligned_index=(0, 0, 0), @@ -30,11 +30,11 @@ def test_timing_collector(): west_edge=True, east_edge=True, ) - stencil_config = pace.dsl.StencilConfig( + stencil_config = ndsl.dsl.StencilConfig( compilation_config=CompilationConfig(backend="numpy", rebuild=True) ) - stencil_factory = pace.dsl.StencilFactory(stencil_config, grid_indexing) + stencil_factory = ndsl.dsl.StencilFactory(stencil_config, grid_indexing) def func(inp: Field[float], out: Field[float]): with computation(PARALLEL), interval(...): diff --git a/tests/main/dsl/test_stencil_config.py b/tests/main/dsl/test_stencil_config.py index 6ebfddb3..45891df4 100644 --- a/tests/main/dsl/test_stencil_config.py +++ b/tests/main/dsl/test_stencil_config.py @@ -1,7 +1,7 @@ import pytest -from pace.dsl.dace.dace_config import DaceConfig -from pace.dsl.stencil import CompilationConfig, StencilConfig +from ndsl.dsl.dace.dace_config import DaceConfig +from ndsl.dsl.stencil import CompilationConfig, StencilConfig @pytest.mark.parametrize("validate_args", [True, False]) diff --git a/tests/main/dsl/test_stencil_factory.py b/tests/main/dsl/test_stencil_factory.py index bf74bf41..49e8153d 100644 --- a/tests/main/dsl/test_stencil_factory.py +++ b/tests/main/dsl/test_stencil_factory.py @@ -2,18 +2,18 @@ import pytest from gt4py.cartesian.gtscript import PARALLEL, computation, horizontal, interval, region -import pace.util -from pace.dsl.dace.dace_config import DaceConfig -from pace.dsl.gt4py_utils import make_storage_from_shape -from pace.dsl.stencil import ( +import ndsl.util +from ndsl.dsl.dace.dace_config import DaceConfig +from ndsl.dsl.gt4py_utils import make_storage_from_shape +from ndsl.dsl.stencil import ( CompareToNumpyStencil, FrozenStencil, GridIndexing, StencilFactory, get_stencils_with_varied_bounds, ) -from pace.dsl.stencil_config import CompilationConfig, StencilConfig -from pace.dsl.typing import FloatField +from ndsl.dsl.stencil_config import CompilationConfig, StencilConfig +from ndsl.dsl.typing import FloatField def copy_stencil(q_in: FloatField, q_out: FloatField): @@ -133,7 +133,7 @@ def test_stencil_factory_numpy_comparison_from_dims_halo(enabled: bool): factory = StencilFactory(config=config, grid_indexing=indexing) stencil = factory.from_dims_halo( func=copy_stencil, - compute_dims=[pace.util.X_DIM, pace.util.Y_DIM, pace.util.Z_DIM], + compute_dims=[ndsl.util.X_DIM, ndsl.util.Y_DIM, ndsl.util.Z_DIM], compute_halos=(), ) if enabled: diff --git a/tests/main/dsl/test_stencil_wrapper.py b/tests/main/dsl/test_stencil_wrapper.py index 551523f6..571c1b48 100644 --- a/tests/main/dsl/test_stencil_wrapper.py +++ b/tests/main/dsl/test_stencil_wrapper.py @@ -6,12 +6,12 @@ import pytest from gt4py.cartesian.gtscript import PARALLEL, computation, interval -import pace.util -from pace.dsl.dace.dace_config import DaceConfig, DaCeOrchestration -from pace.dsl.gt4py_utils import make_storage_from_shape -from pace.dsl.stencil import FrozenStencil, _convert_quantities_to_storage -from pace.dsl.stencil_config import CompilationConfig, StencilConfig -from pace.dsl.typing import Float, FloatField +import ndsl.util +from ndsl.dsl.dace.dace_config import DaceConfig, DaCeOrchestration +from ndsl.dsl.gt4py_utils import make_storage_from_shape +from ndsl.dsl.stencil import FrozenStencil, _convert_quantities_to_storage +from ndsl.dsl.stencil_config import CompilationConfig, StencilConfig +from ndsl.dsl.typing import Float, FloatField def get_stencil_config( @@ -299,7 +299,7 @@ def test_backend_options( def get_mock_quantity(): - return unittest.mock.MagicMock(spec=pace.util.Quantity) + return unittest.mock.MagicMock(spec=ndsl.util.Quantity) def test_convert_quantities_to_storage_no_args(): diff --git a/tests/main/fv3core/test_cartesian_grid.py b/tests/main/fv3core/test_cartesian_grid.py index 986f4eaf..d96ff4e0 100644 --- a/tests/main/fv3core/test_cartesian_grid.py +++ b/tests/main/fv3core/test_cartesian_grid.py @@ -1,9 +1,9 @@ import numpy as np import pytest -import pace.util -from pace.util.constants import PI -from pace.util.grid.generation import MetricTerms +import ndsl.util +from ndsl.util.constants import PI +from ndsl.util.grid.generation import MetricTerms @pytest.mark.parametrize("npx", [8]) @@ -22,9 +22,9 @@ def test_cartesian_grid_generation( deglat: float, backend: str, ): - mpi_comm = pace.util.NullComm(rank=0, total_ranks=1) - partitioner = pace.util.TilePartitioner((1, 1)) - communicator = pace.util.TileCommunicator(mpi_comm, partitioner) + mpi_comm = ndsl.util.NullComm(rank=0, total_ranks=1) + partitioner = ndsl.util.TilePartitioner((1, 1)) + communicator = ndsl.util.TileCommunicator(mpi_comm, partitioner) grid_generator = MetricTerms.from_tile_sizing( npx=npx, npy=npy, diff --git a/tests/main/fv3core/test_dycore_call.py b/tests/main/fv3core/test_dycore_call.py index 4fd7a471..cf6f129a 100644 --- a/tests/main/fv3core/test_dycore_call.py +++ b/tests/main/fv3core/test_dycore_call.py @@ -4,23 +4,23 @@ from datetime import timedelta from typing import Tuple -import pace.dsl.stencil +import ndsl.dsl.stencil +import ndsl.stencils.testing +import ndsl.util import pace.fv3core.initialization.analytic_init as ai -import pace.stencils.testing -import pace.util +from ndsl.dsl.dace.dace_config import DaceConfig +from ndsl.stencils.testing import assert_same_temporaries, copy_temporaries +from ndsl.util.grid import DampingCoefficients, GridData, MetricTerms +from ndsl.util.null_comm import NullComm from pace import fv3core -from pace.dsl.dace.dace_config import DaceConfig from pace.fv3core.dycore_state import DycoreState -from pace.stencils.testing import assert_same_temporaries, copy_temporaries -from pace.util.grid import DampingCoefficients, GridData, MetricTerms -from pace.util.null_comm import NullComm DIR = os.path.abspath(os.path.dirname(__file__)) def setup_dycore() -> ( - Tuple[fv3core.DynamicalCore, fv3core.DycoreState, pace.util.Timer] + Tuple[fv3core.DynamicalCore, fv3core.DycoreState, ndsl.util.Timer] ): backend = "numpy" config = fv3core.DynamicalCoreConfig( @@ -70,18 +70,18 @@ def setup_dycore() -> ( mpi_comm = NullComm( rank=0, total_ranks=6 * config.layout[0] * config.layout[1], fill_value=0.0 ) - partitioner = pace.util.CubedSpherePartitioner( - pace.util.TilePartitioner(config.layout) + partitioner = ndsl.util.CubedSpherePartitioner( + ndsl.util.TilePartitioner(config.layout) ) - communicator = pace.util.CubedSphereCommunicator(mpi_comm, partitioner) + communicator = ndsl.util.CubedSphereCommunicator(mpi_comm, partitioner) dace_config = DaceConfig(communicator=communicator, backend=backend) - stencil_config = pace.dsl.stencil.StencilConfig( - compilation_config=pace.dsl.stencil.CompilationConfig( + stencil_config = ndsl.dsl.stencil.StencilConfig( + compilation_config=ndsl.dsl.stencil.CompilationConfig( backend=backend, rebuild=False, validate_args=True ), dace_config=dace_config, ) - sizer = pace.util.SubtileGridSizer.from_tile_params( + sizer = ndsl.util.SubtileGridSizer.from_tile_params( nx_tile=config.npx - 1, ny_tile=config.npy - 1, nz=config.npz, @@ -91,10 +91,10 @@ def setup_dycore() -> ( tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, ) - grid_indexing = pace.dsl.stencil.GridIndexing.from_sizer_and_communicator( + grid_indexing = ndsl.dsl.stencil.GridIndexing.from_sizer_and_communicator( sizer=sizer, comm=communicator ) - quantity_factory = pace.util.QuantityFactory.from_backend( + quantity_factory = ndsl.util.QuantityFactory.from_backend( sizer=sizer, backend=backend ) eta_file = "tests/main/input/eta79.nc" @@ -116,7 +116,7 @@ def setup_dycore() -> ( moist_phys=config.moist_phys, comm=communicator, ) - stencil_factory = pace.dsl.stencil.StencilFactory( + stencil_factory = ndsl.dsl.stencil.StencilFactory( config=stencil_config, grid_indexing=grid_indexing, ) @@ -133,16 +133,16 @@ def setup_dycore() -> ( state=state, ) - return dycore, state, pace.util.NullTimer() + return dycore, state, ndsl.util.NullTimer() def copy_state(state1: DycoreState, state2: DycoreState): # copy all attributes of state1 to state2 for attr_name in dir(state1): for _field in fields(type(state1)): - if issubclass(_field.type, pace.util.Quantity): + if issubclass(_field.type, ndsl.util.Quantity): attr = getattr(state1, attr_name) - if isinstance(attr, pace.util.Quantity): + if isinstance(attr, ndsl.util.Quantity): getattr(state2, attr_name).data[:] = attr.data diff --git a/tests/main/fv3core/test_grid.py b/tests/main/fv3core/test_grid.py index ee421370..a537dc6e 100644 --- a/tests/main/fv3core/test_grid.py +++ b/tests/main/fv3core/test_grid.py @@ -4,9 +4,9 @@ import pytest from gt4py.cartesian import gtscript -import pace.dsl.stencil -from pace.dsl.typing import Index3D -from pace.util import ( +import ndsl.dsl.stencil +from ndsl.dsl.typing import Index3D +from ndsl.util import ( X_DIM, X_INTERFACE_DIM, Y_DIM, @@ -67,7 +67,7 @@ def test_axis_offsets( j_start, j_end, ): - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, @@ -137,7 +137,7 @@ def test_origin_full( add: Index3D, origin_full: Index3D, ): - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, @@ -185,7 +185,7 @@ def test_origin_compute( add: Index3D, origin_compute: Index3D, ): - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, @@ -223,7 +223,7 @@ def test_domain_full( add: Index3D, domain_full: Index3D, ): - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, @@ -262,7 +262,7 @@ def test_domain_compute( add: Index3D, domain_compute: Index3D, ): - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, @@ -437,7 +437,7 @@ def test_get_origin_domain( origin_expected: Sequence[int], domain_expected: Sequence[int], ): - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, @@ -496,7 +496,7 @@ def test_get_origin_domain_restricted_vertical( domain_expected: Sequence[int], ): k_start = 2 - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, @@ -610,7 +610,7 @@ def test_get_shape( halos: Sequence[int], shape_expected: Sequence[int], ): - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, @@ -637,7 +637,7 @@ def test_restrict_vertical_defaults( n_halo, south_edge, north_edge, west_edge, east_edge ): domain = (3, 4, 10) - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, @@ -665,7 +665,7 @@ def test_restrict_vertical_default_domain( n_halo, south_edge, north_edge, west_edge, east_edge ): domain = (3, 4, 10) - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, @@ -693,7 +693,7 @@ def test_restrict_vertical_max_shape( n_halo, south_edge, north_edge, west_edge, east_edge ): domain = (3, 4, 10) - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, @@ -722,7 +722,7 @@ def test_restrict_vertical( n_halo, south_edge, north_edge, west_edge, east_edge, k_start, nk ): domain = (3, 4, 10) - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, @@ -760,7 +760,7 @@ def test_restrict_vertical_twice( second_nk, ): domain = (3, 4, 10) - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, @@ -792,7 +792,7 @@ def test_restrict_vertical_raises( n_halo, south_edge, north_edge, west_edge, east_edge, k_start, nk ): domain = (3, 4, 10) - grid = pace.dsl.stencil.GridIndexing( + grid = ndsl.dsl.stencil.GridIndexing( domain=domain, n_halo=n_halo, south_edge=south_edge, diff --git a/tests/main/fv3core/test_init_from_geos.py b/tests/main/fv3core/test_init_from_geos.py index 7e03caf0..1844eb31 100644 --- a/tests/main/fv3core/test_init_from_geos.py +++ b/tests/main/fv3core/test_init_from_geos.py @@ -2,8 +2,8 @@ import numpy as np import pytest # noqa +from ndsl.util.null_comm import NullComm from pace import fv3core -from pace.util.null_comm import NullComm def test_geos_wrapper(): diff --git a/tests/main/physics/test_integration.py b/tests/main/physics/test_integration.py index 84cd6d31..0075198c 100644 --- a/tests/main/physics/test_integration.py +++ b/tests/main/physics/test_integration.py @@ -3,12 +3,12 @@ import numpy as np -import pace.dsl +import ndsl.dsl +import ndsl.util +import ndsl.util.grid import pace.physics -import pace.util -import pace.util.grid -from pace.dsl.stencil_config import CompilationConfig -from pace.stencils.testing import assert_same_temporaries, copy_temporaries +from ndsl.dsl.stencil_config import CompilationConfig +from ndsl.stencils.testing import assert_same_temporaries, copy_temporaries try: @@ -23,12 +23,12 @@ def setup_physics(): physics_config = pace.physics.PhysicsConfig( dt_atmos=225, hydrostatic=False, npx=13, npy=13, npz=79, nwat=6, do_qa=True ) - mpi_comm = pace.util.NullComm( + mpi_comm = ndsl.util.NullComm( rank=0, total_ranks=6 * layout[0] * layout[1], fill_value=0.0 ) - partitioner = pace.util.CubedSpherePartitioner(pace.util.TilePartitioner(layout)) - communicator = pace.util.CubedSphereCommunicator(mpi_comm, partitioner) - sizer = pace.util.SubtileGridSizer.from_tile_params( + partitioner = ndsl.util.CubedSpherePartitioner(ndsl.util.TilePartitioner(layout)) + communicator = ndsl.util.CubedSphereCommunicator(mpi_comm, partitioner) + sizer = ndsl.util.SubtileGridSizer.from_tile_params( nx_tile=physics_config.npx - 1, ny_tile=physics_config.npy - 1, nz=physics_config.npz, @@ -38,18 +38,18 @@ def setup_physics(): tile_partitioner=partitioner.tile, tile_rank=communicator.tile.rank, ) - grid_indexing = pace.dsl.stencil.GridIndexing.from_sizer_and_communicator( + grid_indexing = ndsl.dsl.stencil.GridIndexing.from_sizer_and_communicator( sizer=sizer, comm=communicator ) - quantity_factory = pace.util.QuantityFactory.from_backend( + quantity_factory = ndsl.util.QuantityFactory.from_backend( sizer=sizer, backend=backend ) - dace_config = pace.dsl.DaceConfig( + dace_config = ndsl.dsl.DaceConfig( communicator=communicator, backend=backend, - orchestration=pace.dsl.DaCeOrchestration.Python, + orchestration=ndsl.dsl.DaCeOrchestration.Python, ) - stencil_config = pace.dsl.stencil.StencilConfig( + stencil_config = ndsl.dsl.stencil.StencilConfig( compilation_config=CompilationConfig( backend=backend, rebuild=False, @@ -57,16 +57,16 @@ def setup_physics(): ), dace_config=dace_config, ) - stencil_factory = pace.dsl.stencil.StencilFactory( + stencil_factory = ndsl.dsl.stencil.StencilFactory( config=stencil_config, grid_indexing=grid_indexing, ) - metric_terms = pace.util.grid.MetricTerms( + metric_terms = ndsl.util.grid.MetricTerms( quantity_factory=quantity_factory, communicator=communicator, eta_file="tests/main/input/eta79.nc", ) - grid_data = pace.util.grid.GridData.new_from_metric_terms(metric_terms) + grid_data = ndsl.util.grid.GridData.new_from_metric_terms(metric_terms) physics = pace.physics.Physics( stencil_factory, quantity_factory, diff --git a/tests/main/test_grid_init.py b/tests/main/test_grid_init.py index 55e00e81..7aba48a0 100644 --- a/tests/main/test_grid_init.py +++ b/tests/main/test_grid_init.py @@ -1,15 +1,15 @@ import numpy as np import pytest -import pace.util -from pace.util.grid import MetricTerms +import ndsl.util +from ndsl.util.grid import MetricTerms def get_cube_comm(layout, rank: int): - return pace.util.CubedSphereCommunicator( - comm=pace.util.NullComm(rank=rank, total_ranks=6 * layout[0] * layout[1]), - partitioner=pace.util.CubedSpherePartitioner( - pace.util.TilePartitioner(layout=layout) + return ndsl.util.CubedSphereCommunicator( + comm=ndsl.util.NullComm(rank=rank, total_ranks=6 * layout[0] * layout[1]), + partitioner=ndsl.util.CubedSpherePartitioner( + ndsl.util.TilePartitioner(layout=layout) ), ) @@ -17,8 +17,8 @@ def get_cube_comm(layout, rank: int): def get_quantity_factory(layout, nx_tile, ny_tile, nz): nx = nx_tile // layout[0] ny = ny_tile // layout[1] - return pace.util.QuantityFactory( - sizer=pace.util.SubtileGridSizer( + return ndsl.util.QuantityFactory( + sizer=ndsl.util.SubtileGridSizer( nx=nx, ny=ny, nz=nz, n_halo=3, extra_dim_lengths={} ), numpy=np, @@ -48,7 +48,7 @@ def test_grid_init_not_decomposition_dependent(rank: int): communicator=get_cube_comm(rank=rank, layout=(3, 3)), eta_file=eta_file, ) - partitioner = pace.util.TilePartitioner(layout=(3, 3)) + partitioner = ndsl.util.TilePartitioner(layout=(3, 3)) assert allclose(metric_terms_1by1.grid, metric_terms_3by3.grid, partitioner, rank) assert allclose(metric_terms_1by1.agrid, metric_terms_3by3.agrid, partitioner, rank) assert allclose(metric_terms_1by1.area, metric_terms_3by3.area, partitioner, rank) @@ -84,9 +84,9 @@ def test_grid_init_not_decomposition_dependent(rank: int): def allclose( - q_1by1: pace.util.Quantity, - q_3by3: pace.util.Quantity, - partitioner: pace.util.TilePartitioner, + q_1by1: ndsl.util.Quantity, + q_3by3: ndsl.util.Quantity, + partitioner: ndsl.util.TilePartitioner, rank: int, ): subtile_slice = partitioner.subtile_slice( diff --git a/tests/mpi_54rank/test_ext_grid/test_external_grid.py b/tests/mpi_54rank/test_ext_grid/test_external_grid.py index 03f50e65..8456a3ae 100644 --- a/tests/mpi_54rank/test_ext_grid/test_external_grid.py +++ b/tests/mpi_54rank/test_ext_grid/test_external_grid.py @@ -6,10 +6,10 @@ import xarray as xr import yaml -import pace.util +import ndsl.util +from ndsl.util.constants import PI, RADIUS +from ndsl.util.mpi import MPIComm from pace.driver import Driver, DriverConfig -from pace.util.constants import PI, RADIUS -from pace.util.mpi import MPIComm DIR = os.path.dirname(os.path.abspath(__file__)) @@ -25,16 +25,16 @@ def get_cube_comm(layout, comm: MPIComm): - return pace.util.CubedSphereCommunicator( + return ndsl.util.CubedSphereCommunicator( comm=comm, - partitioner=pace.util.CubedSpherePartitioner( - pace.util.TilePartitioner(layout=layout) + partitioner=ndsl.util.CubedSpherePartitioner( + ndsl.util.TilePartitioner(layout=layout) ), ) def get_tile_num(comm: MPIComm): - return pace.util.get_tile_number(comm.rank, comm.partitioner.total_ranks) + return ndsl.util.get_tile_number(comm.rank, comm.partitioner.total_ranks) # TODO: Location of test configurations and data will be changed @@ -101,28 +101,28 @@ def test_extgrid_equals_generated(config_file_path: str, ranks: int): subtile_slice_grid = cube_comm.partitioner.tile.subtile_slice( rank=cube_comm.rank, - global_dims=[pace.util.Y_INTERFACE_DIM, pace.util.X_INTERFACE_DIM], + global_dims=[ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_INTERFACE_DIM], global_extent=(npy, npx), overlap=True, ) subtile_slice_dx = cube_comm.partitioner.tile.subtile_slice( rank=cube_comm.rank, - global_dims=[pace.util.Y_INTERFACE_DIM, pace.util.X_DIM], + global_dims=[ndsl.util.Y_INTERFACE_DIM, ndsl.util.X_DIM], global_extent=(npy, nx), overlap=True, ) subtile_slice_dy = cube_comm.partitioner.tile.subtile_slice( rank=cube_comm.rank, - global_dims=[pace.util.Y_DIM, pace.util.X_INTERFACE_DIM], + global_dims=[ndsl.util.Y_DIM, ndsl.util.X_INTERFACE_DIM], global_extent=(ny, npx), overlap=True, ) subtile_slice_area = cube_comm.partitioner.tile.subtile_slice( rank=cube_comm.rank, - global_dims=[pace.util.Y_DIM, pace.util.X_DIM], + global_dims=[ndsl.util.Y_DIM, ndsl.util.X_DIM], global_extent=(ny, nx), overlap=True, ) diff --git a/tests/mpi_54rank/test_grid_init.py b/tests/mpi_54rank/test_grid_init.py index 855c539e..38149f35 100644 --- a/tests/mpi_54rank/test_grid_init.py +++ b/tests/mpi_54rank/test_grid_init.py @@ -1,23 +1,23 @@ from typing import Dict import numpy as np +from util.ndsl.util.grid.helper import GridData +import ndsl.util import pace.fv3core -import pace.util +from ndsl.util.grid import MetricTerms +from ndsl.util.mpi import MPIComm +from ndsl.util.quantity import Quantity from pace.fv3core.initialization.test_cases.initialize_baroclinic import ( init_baroclinic_state, ) -from pace.util.grid import MetricTerms -from pace.util.mpi import MPIComm -from pace.util.quantity import Quantity -from util.pace.util.grid.helper import GridData def get_cube_comm(layout, comm: MPIComm): - return pace.util.CubedSphereCommunicator( + return ndsl.util.CubedSphereCommunicator( comm=comm, - partitioner=pace.util.CubedSpherePartitioner( - pace.util.TilePartitioner(layout=layout) + partitioner=ndsl.util.CubedSpherePartitioner( + ndsl.util.TilePartitioner(layout=layout) ), ) @@ -25,8 +25,8 @@ def get_cube_comm(layout, comm: MPIComm): def get_quantity_factory(layout, nx_tile, ny_tile, nz): nx = nx_tile // layout[0] ny = ny_tile // layout[1] - return pace.util.QuantityFactory( - sizer=pace.util.SubtileGridSizer( + return ndsl.util.QuantityFactory( + sizer=ndsl.util.SubtileGridSizer( nx=nx, ny=ny, nz=nz, n_halo=3, extra_dim_lengths={} ), numpy=np, @@ -144,7 +144,7 @@ def dycore_state_to_quantity_dict( def gather_all( - quantity_dict: Dict[str, Quantity], tile_comm: pace.util.TileCommunicator + quantity_dict: Dict[str, Quantity], tile_comm: ndsl.util.TileCommunicator ) -> Dict[str, Quantity]: gathered = {} for name, quantity in quantity_dict.items(): @@ -235,7 +235,7 @@ def test_baroclinic_init_not_decomposition_dependent(): assert allclose(computed_1by1[name], gathered_3by3[name], name, global_rank) -def allclose(q_1by1: pace.util.Quantity, q_3by3: pace.util.Quantity, name: str, rank): +def allclose(q_1by1: ndsl.util.Quantity, q_3by3: ndsl.util.Quantity, name: str, rank): print("1by1", q_1by1.metadata, "3by3", q_3by3.metadata) assert q_1by1.view[:].shape == q_3by3.view[:].shape, name same = (q_1by1.view[:] == q_3by3.view[:]) | np.isnan(q_1by1.view[:]) diff --git a/tests/savepoint/test_checkpoints.py b/tests/savepoint/test_checkpoints.py index 4d1c8db6..d5f525bf 100644 --- a/tests/savepoint/test_checkpoints.py +++ b/tests/savepoint/test_checkpoints.py @@ -8,16 +8,16 @@ import xarray as xr import yaml -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util +from ndsl.stencils.testing import TranslateGrid, dataset_to_dict +from ndsl.stencils.testing.grid import Grid +from ndsl.util.checkpointer.thresholds import SavepointThresholds +from ndsl.util.grid import DampingCoefficients, GridData +from ndsl.util.testing import perturb from pace import fv3core from pace.fv3core.initialization.dycore_state import DycoreState from pace.fv3core.testing.translate_fvdynamics import TranslateFVDynamics -from pace.stencils.testing import TranslateGrid, dataset_to_dict -from pace.stencils.testing.grid import Grid -from pace.util.checkpointer.thresholds import SavepointThresholds -from pace.util.grid import DampingCoefficients, GridData -from pace.util.testing import perturb def get_grid(data_path: str, rank: int, layout: Tuple[int, int], backend: str) -> Grid: @@ -52,26 +52,26 @@ def test_fv_dynamics( backend: str, data_path: str, calibrate_thresholds: bool, threshold_path: str ): print("start test call") - namelist = pace.util.Namelist.from_f90nml( + namelist = ndsl.util.Namelist.from_f90nml( f90nml.read(os.path.join(data_path, "input.nml")) ) threshold_filename = os.path.join(threshold_path, "fv_dynamics.yaml") - communicator = pace.util.CubedSphereCommunicator( - comm=pace.util.MPIComm(), - partitioner=pace.util.CubedSpherePartitioner( - tile=pace.util.TilePartitioner(layout=namelist.layout) + communicator = ndsl.util.CubedSphereCommunicator( + comm=ndsl.util.MPIComm(), + partitioner=ndsl.util.CubedSpherePartitioner( + tile=ndsl.util.TilePartitioner(layout=namelist.layout) ), ) - stencil_factory = pace.dsl.StencilFactory( - config=pace.dsl.StencilConfig( - compilation_config=pace.dsl.CompilationConfig( + stencil_factory = ndsl.dsl.StencilFactory( + config=ndsl.dsl.StencilConfig( + compilation_config=ndsl.dsl.CompilationConfig( backend=backend, communicator=communicator, rebuild=False, ) ), - grid_indexing=pace.dsl.GridIndexing.from_sizer_and_communicator( - sizer=pace.util.SubtileGridSizer.from_tile_params( + grid_indexing=ndsl.dsl.GridIndexing.from_sizer_and_communicator( + sizer=ndsl.util.SubtileGridSizer.from_tile_params( nx_tile=namelist.npx - 1, ny_tile=namelist.npy - 1, nz=namelist.npz, @@ -120,11 +120,11 @@ def test_fv_dynamics( with open(threshold_filename, "r") as f: data = yaml.safe_load(f) thresholds = dacite.from_dict( - data_class=pace.util.SavepointThresholds, + data_class=ndsl.util.SavepointThresholds, data=data, config=dacite.Config(strict=True), ) - validation = pace.util.ValidationCheckpointer( + validation = ndsl.util.ValidationCheckpointer( savepoint_data_path=data_path, thresholds=thresholds, rank=communicator.rank ) state, grid_data = initializer.new_state() @@ -146,15 +146,15 @@ def test_fv_dynamics( def _calibrate_thresholds( initializer: StateInitializer, - communicator: pace.util.CubedSphereCommunicator, - stencil_factory: pace.dsl.StencilFactory, - quantity_factory: pace.util.QuantityFactory, + communicator: ndsl.util.CubedSphereCommunicator, + stencil_factory: ndsl.dsl.StencilFactory, + quantity_factory: ndsl.util.QuantityFactory, damping_coefficients: DampingCoefficients, dycore_config: fv3core.DynamicalCoreConfig, n_trials: int, factor: float, ): - calibration = pace.util.ThresholdCalibrationCheckpointer(factor=factor) + calibration = ndsl.util.ThresholdCalibrationCheckpointer(factor=factor) for i in range(n_trials): print(f"running calibration trial {i}") trial_state, grid_data = initializer.new_state() @@ -185,10 +185,10 @@ def set_manual_thresholds(thresholds: SavepointThresholds): # all thresholds on the input data are 0 because no computation has happened yet for entry in thresholds.savepoints["FVDynamics-In"]: for name in entry: - entry[name] = pace.util.Threshold(relative=0.0, absolute=0.0) + entry[name] = ndsl.util.Threshold(relative=0.0, absolute=0.0) -def merge_thresholds(all_thresholds: List[pace.util.SavepointThresholds]): +def merge_thresholds(all_thresholds: List[ndsl.util.SavepointThresholds]): thresholds = all_thresholds[0] for other_thresholds in all_thresholds[1:]: for savepoint_name in thresholds.savepoints: @@ -210,5 +210,5 @@ def dycore_state_to_dict(state: DycoreState): return { name: getattr(state, name).data for name in dir(state) - if isinstance(getattr(state, name), pace.util.Quantity) + if isinstance(getattr(state, name), ndsl.util.Quantity) } diff --git a/tests/savepoint/translate/__init__.py b/tests/savepoint/translate/__init__.py new file mode 100644 index 00000000..e7f366ac --- /dev/null +++ b/tests/savepoint/translate/__init__.py @@ -0,0 +1 @@ +from .translate_driver import TranslateDriver diff --git a/physics/tests/savepoint/translate/translate_driver.py b/tests/savepoint/translate/translate_driver.py similarity index 92% rename from physics/tests/savepoint/translate/translate_driver.py rename to tests/savepoint/translate/translate_driver.py index 6910df18..61251079 100644 --- a/physics/tests/savepoint/translate/translate_driver.py +++ b/tests/savepoint/translate/translate_driver.py @@ -1,5 +1,6 @@ -import pace.dsl -import pace.util +import ndsl.dsl +import ndsl.util +from ndsl.util.namelist import Namelist from pace.driver.run import Driver, DriverConfig from pace.driver.state import TendencyState from pace.fv3core._config import DynamicalCoreConfig @@ -9,7 +10,6 @@ from pace.fv3core.testing.translate_fvdynamics import TranslateFVDynamics from pace.fv3core.testing.validation import enable_selective_validation from pace.physics import PHYSICS_PACKAGES, PhysicsConfig, PhysicsState -from pace.util.namelist import Namelist enable_selective_validation() @@ -28,18 +28,18 @@ def __init__(self, grid, namelist, stencil_factory): def compute_parallel(self, inputs, communicator): dycore_state = self.state_from_inputs(inputs) - sizer = pace.util.SubtileGridSizer.from_tile_params( + sizer = ndsl.util.SubtileGridSizer.from_tile_params( nx_tile=self.namelist.npx - 1, ny_tile=self.namelist.npy - 1, nz=self.namelist.npz, - n_halo=pace.util.N_HALO_DEFAULT, + n_halo=ndsl.util.N_HALO_DEFAULT, extra_dim_lengths={}, layout=self.namelist.layout, tile_partitioner=communicator.partitioner.tile, tile_rank=communicator.tile.rank, ) - quantity_factory = pace.util.QuantityFactory.from_backend( + quantity_factory = ndsl.util.QuantityFactory.from_backend( sizer, backend=self.stencil_config.compilation_config.backend ) physics_state = PhysicsState.init_zeros( diff --git a/util/.gitignore b/util/.gitignore deleted file mode 100644 index c3444483..00000000 --- a/util/.gitignore +++ /dev/null @@ -1,110 +0,0 @@ -.DS_Store -.idea - -# Fortran compilation files -*.o -*.mod - -# Cython c-output -*.c - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# pyenv -.python-version - -# celery beat schedule file -celerybeat-schedule - -# SageMath parsed files -*.sage.py - -# dotenv -.env - -# virtualenv -.venv -venv/ -ENV/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.vscode diff --git a/util/.jenkins/actions/test.sh b/util/.jenkins/actions/test.sh deleted file mode 100755 index 73afc358..00000000 --- a/util/.jenkins/actions/test.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash -f - -set -x -e - -################################################## -# functions -################################################## - -exitError() -{ - echo "ERROR $1: $3" 1>&2 - echo "ERROR LOCATION=$0" 1>&2 - echo "ERROR LINE=$2" 1>&2 - exit $1 -} - -showUsage() -{ - echo "usage: `basename $0` [-h]" - echo "" - echo "optional arguments:" - echo "-h show this help message and exit" -} - -parseOptions() -{ - # process command line options - while getopts "h" opt - do - case $opt in - h) showUsage; exit 0 ;; - \?) showUsage; exitError 301 ${LINENO} "invalid command line option (-${OPTARG})" ;; - :) showUsage; exitError 302 ${LINENO} "command line option (-${OPTARG}) requires argument" ;; - esac - done - -} - -# echo basic setup -echo "####### executing: $0 $* (PID=$$ HOST=$HOSTNAME TIME=`date '+%D %H:%M:%S'`)" - -JENKINS_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )/../" - -# start timer -T="$(date +%s)" - -# parse command line options (pass all of them to function) -parseOptions $* - -# run tests -echo "### run tests" -pytest --junitxml results.xml tests - -# end timer and report time taken -T="$(($(date +%s)-T))" -printf "####### time taken: %02d:%02d:%02d:%02d\n" "$((T/86400))" "$((T/3600%24))" "$((T/60%60))" "$((T%60))" - -# no errors encountered -echo "####### finished: $0 $* (PID=$$ HOST=$HOSTNAME TIME=`date '+%D %H:%M:%S'`)" -exit 0 - -# so long, Earthling! diff --git a/util/.jenkins/cache.sh b/util/.jenkins/cache.sh deleted file mode 120000 index b70ea14a..00000000 --- a/util/.jenkins/cache.sh +++ /dev/null @@ -1 +0,0 @@ -../../.jenkins/cache.sh \ No newline at end of file diff --git a/util/.jenkins/checksum.sh b/util/.jenkins/checksum.sh deleted file mode 120000 index 1b7d08c9..00000000 --- a/util/.jenkins/checksum.sh +++ /dev/null @@ -1 +0,0 @@ -../../.jenkins/checksum.sh \ No newline at end of file diff --git a/util/.jenkins/env b/util/.jenkins/env deleted file mode 120000 index 913569ea..00000000 --- a/util/.jenkins/env +++ /dev/null @@ -1 +0,0 @@ -../../external/buildenv \ No newline at end of file diff --git a/util/.jenkins/jenkins.sh b/util/.jenkins/jenkins.sh deleted file mode 100755 index 015bd14e..00000000 --- a/util/.jenkins/jenkins.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash -f - -# This is the main script used to trigger Jenkins actions. -# The idea of this script is to keep the amount of code in the "Execute shell" field small -# -# Example syntax: -# .jenkins/jenkins.sh test -# -# Other actions such as test/build/deploy can be defined. - -### Some environment variables available from Jenkins -### Note: for a complete list see https://jenkins.ginko.ch/env-vars.html -# slave The name of the build worker (daint, kesch, ...). -# BUILD_NUMBER The current build number, such as "153". -# BUILD_ID The current build id, such as "2005-08-22_23-59-59" (YYYY-MM-DD_hh-mm-ss). -# BUILD_DISPLAY_NAME The display name of the current build, something like "#153" by default. -# NODE_NAME Name of the worker if the build is on a worker, or "master" if run on main worker. -# NODE_LABELS Whitespace-separated list of labels that the node is assigned. -# JENKINS_HOME The absolute path of the data storage directory assigned on the master node. -# JENKINS_URL Full URL of Jenkins, like http://server:port/jenkins/ -# BUILD_URL Full URL of this build, like http://server:port/jenkins/job/foo/15/ -# JOB_URL Full URL of this job, like http://server:port/jenkins/job/foo/ - -set -x +e - -JENKINS_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" -BUILDENV_DIR=$JENKINS_DIR/../../buildenv - -# some global variables -action="$1" -optarg="$2" - -# Timeout after this many minutes -minutes=45 - -# get latest version of buildenv -git submodule update --init - -# setup module environment and default queue -. ${BUILDENV_DIR}/machineEnvironment.sh - -# load machine dependent environment -. ${BUILDENV_DIR}/env.${host}.sh - -# load scheduler tools (provides run_command) -. ${BUILDENV_DIR}/schedulerTools.sh - -set -e - -# check if action script exists -script="${JENKINS_DIR}/actions/${action}.sh" -test -f "${script}" || exitError 1301 ${LINENO} "cannot find script ${script}" - -# set up virtual env -python3 --version -python3 -m venv venv -. ./venv/bin/activate -pip3 install --upgrade pip setuptools wheel -pip3 install -r $JENKINS_DIR/../requirements.txt -c $JENKINS_DIR/../../constraints.txt -pip3 install -e ${JENKINS_DIR}/../external/gt4py -c $JENKINS_DIR/../../constraints.txt -pip3 install -e ${JENKINS_DIR}/../ -c $JENKINS_DIR/../../constraints.txt - -set +e - -if [ "${target}" == "cpu" ] ; then - scheduler = "none" -fi - -echo "I am running on host ${host} with scheduler ${scheduler}." -run_command "${script} ${optarg}" "UtilAction${action}" $minutes - -if [ $? -ne 0 ] ; then - exitError 1510 ${LINENO} "problem while executing script ${script}" -fi -echo "### ACTION ${action} SUCCESSFUL" diff --git a/util/.jenkins/test_util.sh b/util/.jenkins/test_util.sh deleted file mode 100755 index 8b169652..00000000 --- a/util/.jenkins/test_util.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash - -set -e - -SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" - -if [ "${target}" == "gpu" ] ; then - # we only run this on HPC - set +e - module load cray-python - module load pycuda - set -e -fi - -# run tests -echo "restoring cache" - -UTIL_DIR=$SCRIPT_DIR/.. - -cache_key=v1-util-$($SCRIPT_DIR/checksum.sh $SCRIPT_DIR/test_util.sh $UTIL_DIR/requirements.txt $UTIL_DIR/requirements_gpu.txt $UTIL_DIR/../constraints.txt)-$target - -$SCRIPT_DIR/cache.sh restore $cache_key - -echo "running tests" - -python3 -m venv venv -. ./venv/bin/activate - -if [ "${target}" == "gpu" ] ; then - set +e - module unload cray-python - module unload pycuda - set -e - pip3 install -r $UTIL_DIR/requirements.txt -r $UTIL_DIR/requirements_gpu.txt -c $UTIL_DIR/../constraints.txt -e $UTIL_DIR -else - pip3 install -r $UTIL_DIR/requirements.txt -c $UTIL_DIR/../constraints.txt -e $UTIL_DIR -fi - -pytest --junitxml results.xml $UTIL_DIR/tests - -echo "saving cache" - -$SCRIPT_DIR/cache.sh save $cache_key venv - -deactivate - -exit 0 diff --git a/util/HISTORY.md b/util/HISTORY.md deleted file mode 100644 index 0d54eca5..00000000 --- a/util/HISTORY.md +++ /dev/null @@ -1,166 +0,0 @@ -History -======= - -latest ------- - -- Added `MetaEnumStr` to utils to make enums more functional -- Added `fill_for_translate_test` to MetricTerms to fill fields with NaNs only when required for testing -- Added `init_cartesian` method to MetricTerms to handle grid generation for orthogonal grids -- Added `from_layout` and `size` methods to TileCommunicator and Communicator -- Added `__init__` and `total_ranks` abstract methods to Partitioner -- Added `grid_type` to MetricTerms and DriverGridData -- Added `dx_const`, `dy_const`, `deglat`, and `u_max` namelist settings for doubly-periodic grids -- Added `dx_const`, `dy_const`, and `deglat` to grid generation code for doubly-periodic grids -- Added f32 support to halo exchange data transformation -- Use one single logger, from logging.py -- Removed hard-coded values of `ak` and `bk` arrays and added in the feature to read in `ak` and `bk` values - from a NetCDF file to compute the `eta` and `eta_v` values. - -v0.10.0 -------- - -Major changes: - -- Added the following attributes/methods to Communicator: `tile`, `halo_update`, `boundaries`, `start_halo_update`, `vector_halo_update`, `start_vector_halo_update`, `synchronize_vector_interfaces`, `start_synchronize_vector_interfaces`, `get_scalar_halo_updater`, and `get_vector_halo_updater` -- Added Checkpointer and NullCheckpointer classes -- Added SnapshotCheckpointer -- Comm and Request abstract base classes are added to the top level -- Added the following attributes/methods to the Comm abstract base classes: `allreduce`, `allgather` -- Added classes `Threshold`, `ThresholdCalibrationCheckpointer`, `ValidationCheckpointer`, and `SavepointThresholds` -- Added `get_fs` as publicly-available function -- Legacy restart routines can now load restart data from any fsspec-supported filesystem -- Legacy restart routines will raise an exception if no restart files are present instead of loading an empty state -- Added NetCDFMonitor for saving the global state in time-chunked NetCDF files - -Minor changes: - -- Deleted deprecated `finish_halo_update` method from CubedSphereCommunicator -- fixed a bug in `pace.util.grid` where `_reduce_global_area_minmaxes` would use local values instead of the gathered ones -- Added .cleanup() method to ZarrMonitor, used only for API compatibility with NetCDFMonitor and does nothing -- ZarrMonitor.partitioner may now be any Partitioner and not just a CubedSpherePartitioner -- Quantity no longer has a `storage` attribute - the ndarray is directly accessible through the `data` attribute. - -Minor changes: - -- Fixed a bug in normalize_vector(xyz) in `pace.util.grid.gnomonic` where it would divide the input by cells-per-tile, where it should not. -- Refactored `pace.util.grid.helper` so that `HorizontalGridData`, `VerticalGridData`, `ContravariantGridData` and `AngleGridData` have their own `new_from_metric_terms` class methods, and `GridData` calls those in its own method definition. -- Added `stretch_transformation` to `pace.util.grid` - stretches the grid as needed for refinement, tropical test case. - -v0.9.0 ------- - -Major changes: - -- Modified `pace.util.Quantity.transpose` to retain attributes, and loosened `pace.util.ZarrMonitor.store` requirements on attribute consistency, both to ease fv3net integration issues not addressed in v0.8.0 - -v0.8.0 ------- - -Major changes: - -- Changed `ZarrMonitor.store` behavior to allow passing quantities with different dimension orders -- Added `CachingCommWriter` which wraps a `Comm` object and can be serialized to a file-like object with a `.dump` method -- Added `CachingCommReader` which can be loaded from the dump output of `CachingCommWriter` and replays its communication in the order it occurred. -- `NullComm` is now public api in `pace-util` -- Deleted deprecated `finish_vector_halo_update` method from `CubedSphereCommunicator` -- Renamed DummyComm to LocalComm, and added support for message tags. The DummyComm symbol is still in place for backwards compatibility, but points to LocalComm -- added error in CubedSphereCommunicator init if given a communicator with a size not equal to the total ranks of the given partitioner -- `subtile_extent` method of Partitioner classes now takes in a required `rank` argument -- TilePartitioner has a new `edge_interior_ratio` argument which defaults to 1.0, and lets the user specify the relative 1-dimensional extent of the compute domains of ranks on tile edges and corners relative to ranks on the tile interior. In all cases, the closest valid value will be used, which enables some previously invalid configurations (e.g. C128 on a 3 by 3 layout will use the closest valid edge_interior_ratio to 1.0) - -Minor changes: - -- The `split_cartesian_into_storages` method is moved out of pace-util, as it is more generally used, and now lives in pace.dsl.gt4py_utils -- created `DriverGridData.new_from_grid_variables` class method to initialize from grid variable data -- updated QuantityFactory to accept the more generic GridSizer class on initialization -- added `sizer` as public attribute on QuantityFactory -- added `Namelist` class to initialize namelist files used in fv3gfs-fortran -- added `CubedSphereCommunicator.from_layout` constructor method -- added support for built-in `datetime` in ZarrMonitor -- `edge_interior_ratio` is now an optional argument of `tile_extent_from_rank_metadata` -- added support for writing constant data (written once, does not change with time) in ZarrMonitor - -v0.7.0 ------- - -Major changes: - -- Renamed package from fv3gfs-util to pace-util -- Added NullTimer to use for default Timer value, it is a disabled timer which cannot be enabled (raises NotImplementedError) -- Added pace.util.grid, keeping symbols out of top level as they are still unstable -- Added HaloUpdater and associated code, which compiles halo packing for more efficient halo updates -- Added physical constants to pace.util.constants - -Minor changes: - -- Added method set_extra_dim_lengths to QuantityFactory - -Fixes: - -- Fixed bug where ZarrMonitor depended on dict `.items()` always returning items in the same order - -Other changes may exist in this version, as we temporarily paused updating the history on each PR. - -v0.6.0 ------- - -Major changes: - -- Use `cftime.datetime` objects to represent datetimes instead -of `datetime.datetime` objects. This results in times stored in a format compatible with -the fortran model, and accurate internal representation of times with the calendar specified -in the `coupler_nml` namelist. -- `Timer` class is added, with methods `start` and `stop`, and properties `clock` (context manager), and `times` (dictionary of accumulated timing) -- `CubedSphereCommunicator` instances now have a `.timer` attribute, which accumulates times for "pack", "unpack", "Isend", and "Recv" during halo updates -- make `SubtileGridSizer.from_tile_params` public API -- New method `CubedSphereCommunicator.synchronize_vector_interfaces` which synchronizes edge values on interface variables which are duplicated between adjacent ranks -- Added `.sel` method to corner views (e.g. `quantity.view.northeast.sel(x=0, y=1)`) to allow indexing these corner views with arbitrary dimension ordering. -- Halo updates now use tagged send/recv operations, which prevents deadlocks in certain situations -- Quantity.data is now guaranteed to be a numpy or cupy array matching its `.np` module, and will no longer be a gt4py Storage -- Quantity accepts a `gt4py_backend` on initialize which is used to create its `.storage` if one was not used on initialize -- parent MPI rank now referred to as "root" rank in variable names and documentation -- Added TILE_DIM constant for tile dimension of global quantities -- Added Partitioner base class implementing features necessary for scatter/gather -- Moved scatter and gather from TileCommunicator to the Communicator base class, so its code can be re-used by the CubedSphereCommunicator -- Implemented subtile_slice, global_extent, and subtile_extent routines on CubedSpherePartitioner necessary for scatter/gather in CubedSphereCommunicator -- Renamed argument `tile_extent` and `tile_dims` to `global_extent` and `global_dims` in routines to refer generically to the tile in the case of tile scatter/gather or cube in the case of cube scatter/gather -- Fixed a bug where initializing a Quantity with a numpy array and a gpu backend would give CPUStorage -- raise TypeError if initializing a quantity with both a storage and a gt4py_backend argument -- eagerly create storage object when initializing Quantity -- make data type of quantity and storage reflect the gt4py_backend chosen, instead of being determined based on the data type being numpy/cupy - -Fixes: - -- If `only_names` is provided to `open_restart`, it will return those fields and nothing more. Previously it would include `"time"` in the returned state even if it was not requested. -- Fixed a bug where quantity.storage and quantity.data could be out of sync if the quantity was initialized using data and a gt4py backend string -- Default slice for corner views when not given at all as an index (e.g. when providing one index to a 2D view) now gives the same result as providing an empty slice (:) -- Fixed a bug where quantity.view could refer to a different array than quantity.data if the quantity was initialized using data and a gt4py backend string, and then quantity.storage was accessed - -v0.5.1 ------- - -- enable MPI tests on CircleCI - -v0.5.0 ------- - -Breaking changes: - -- `send_buffer` and `recv_buffer` are modified to take in a `callable`, which is more easily serialized than a `numpy`-like module (necessary because we serialize the arguments to re-use buffers), and allows custom specification of the initialization if zeros are needed instead of empty. - -Major changes: - -- Added additional regional views to Quantity as attributes on Quantity.view, including `northeast`, `northwest`, `southeast`, `southwest`, and `interior` -- Separated fv3util into its own repository and began tracking history separately from fv3gfs-python -- Added getters and setters for additional dynamics quantities needed to call an alternative dynamical core -- Added `storage` property to Quantity, implemented as short-term shortcut to .data until gt4py GDP-3 is implemented - -Deprecations: - -- `Quantity.values` is deprecated - -v0.4.3 (2020-05-15) -------------------- - -Last release of fv3util with history contained in fv3gfs-python. diff --git a/util/LICENSE b/util/LICENSE deleted file mode 100644 index 4c477d65..00000000 --- a/util/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ - - -BSD License - -Copyright (c) 2019, Vulcan Technologies LLC -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/util/MANIFEST.in b/util/MANIFEST.in deleted file mode 100644 index b95d675e..00000000 --- a/util/MANIFEST.in +++ /dev/null @@ -1,12 +0,0 @@ -include LICENSE -include README.md -include HISTORY.md - -recursive-include fv3gfs *.json *.yml -recursive-include tests *.py *.sh -recursive-include tests/data * - -recursive-exclude * __pycache__ -recursive-exclude * *.py[co] -recursive-exclude * *.mod *.o -recursive-exclude * *.log diff --git a/util/Makefile b/util/Makefile deleted file mode 100644 index 15569e11..00000000 --- a/util/Makefile +++ /dev/null @@ -1,87 +0,0 @@ -PYTEST_ARGS?= -SHELL = /bin/sh - -define BROWSER_PYSCRIPT -import os, webbrowser, sys - -try: - from urllib import pathname2url -except: - from urllib.request import pathname2url - -webbrowser.open("file://" + pathname2url(os.path.abspath(sys.argv[1]))) -endef -export BROWSER_PYSCRIPT - -define PRINT_HELP_PYSCRIPT -import re, sys - -for line in sys.stdin: - match = re.match(r'^([a-zA-Z_-]+):.*?## (.*)$$', line) - if match: - target, help = match.groups() - print("%-20s %s" % (target, help)) -endef -export PRINT_HELP_PYSCRIPT - -BROWSER := python3 -c "$$BROWSER_PYSCRIPT" - -PYTHON_FILES = $(shell git ls-files | grep -e 'py$$' | grep -v -e '__init__.py') -PYTHON_INIT_FILES = $(shell git ls-files | grep '__init__.py') - -help: - @python3 -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) - -coverage: ## check code coverage quickly with the default Python - pytest --cov=fv3gfs --cov-report=html - $(BROWSER) htmlcov/index.html - -test: ## run tests quickly with the default Python - pytest $(PYTEST_ARGS) tests - -test_mpi: - mpirun -n 6 --allow-run-as-root --mca btl_vader_single_copy_mechanism none --oversubscribe pytest $(PYTEST_ARGS) tests/mpi - $(MAKE) -C examples/mpi - -lint: - black --diff --check $(PYTHON_FILES) $(PYTHON_INIT_FILES) - flake8 $(PYTHON_FILES) - # ignore unused import error in __init__.py files - flake8 --ignore=F401 $(PYTHON_INIT_FILES) - mypy --follow-imports silent --show-error-codes fv3gfs - @echo "LINTING SUCCESSFUL" - -clean: clean-build clean-pyc clean-test - $(MAKE) -C examples/mpi clean - -clean-build: ## remove build artifacts - rm -fr build/ - rm -fr dist/ - rm -fr .eggs/ - find . -name '*.egg-info' -exec rm -fr {} + - find . -name '*.egg' -exec rm -f {} + - -clean-pyc: ## remove Python file artifacts - find . -name '*.pyc' -exec rm -f {} + - find . -name '*.pyo' -exec rm -f {} + - find . -name '*~' -exec rm -f {} + - find . -name '__pycache__' -exec rm -fr {} + - -clean-test: ## remove test and coverage artifacts - rm -fr .tox/ - rm -f .coverage - rm -fr htmlcov/ - rm -fr .pytest_cache - -reformat: - black $(PYTHON_FILES) $(PYTHON_INIT_FILES) - -dist: clean ## builds source and wheel package - python3 setup.py sdist - python3 setup.py bdist_wheel - ls -l dist - -release: dist ## package and upload a release - twine upload dist/* - -.PHONY: clean test lint reformat test_mpi coverage help diff --git a/util/README.md b/util/README.md deleted file mode 100644 index 1c9815c1..00000000 --- a/util/README.md +++ /dev/null @@ -1,5 +0,0 @@ -This package is a toolkit of Python objects and routines for writing weather and climate models. - -This is research software and still in development. We welcome external contributions. If you would like to contribute to this project, please get in touch with one of our developers! - -* Free software: BSD license diff --git a/util/RELEASE.rst b/util/RELEASE.rst deleted file mode 100644 index b630ecf8..00000000 --- a/util/RELEASE.rst +++ /dev/null @@ -1,25 +0,0 @@ -Release Instructions -==================== - -Versions should take the form "v..patch". For example, "v0.3.0" is a valid -version, while "v1" is not and "0.3.0" is not. - -1. Make sure all PRs are merged and tests pass. - -2. Prepare a release branch with `git checkout -b release/util/`. - -3. Update the HISTORY.md, replacing the "latest" version heading with the new version. - -4. Commit your changes so far to the release branch. - -5. In the pace-util directory, run `bumpversion `. This will create a new commit. - -6. `git push -u origin release/util/` and create a new pull request in Github. - -7. When the pull request is merged to main, `git checkout main` and `git pull`, - followed by `git tag util/`. - -8. Run `git push origin --tags` to push all local tags to Github. - -9. Run `make release` to push latest release to PyPI. Contact a core developer to get the - necessary API token. diff --git a/util/examples/mpi/Makefile b/util/examples/mpi/Makefile deleted file mode 100644 index 93c84cb2..00000000 --- a/util/examples/mpi/Makefile +++ /dev/null @@ -1,14 +0,0 @@ - -MPI_ENV_VARS=PMIX_MCA_gds=hash - -all: global_timings zarr_monitor - -global_timings: - $(MPI_ENV_VARS) mpirun -n 4 python -m mpi4py global_timings.py - -zarr_monitor: - $(MPI_ENV_VARS) mpirun -n 6 python -m mpi4py zarr_monitor.py - -clean: - $(RM) -r output/* - touch output/.gitkeep diff --git a/util/external/gt4py b/util/external/gt4py deleted file mode 120000 index 6e790a7f..00000000 --- a/util/external/gt4py +++ /dev/null @@ -1 +0,0 @@ -../../external/gt4py \ No newline at end of file diff --git a/util/requirements.txt b/util/requirements.txt deleted file mode 100644 index 765e5ae4..00000000 --- a/util/requirements.txt +++ /dev/null @@ -1,19 +0,0 @@ -bump2version -wheel -flake8==3.8.4 -mypy==0.790 -tox -coverage -f90nml>=1.1.0 -appdirs>=1.4.0 -sphinx_rtd_theme -pytest-cov -pytest-subtests -gcsfs>=0.7.0 -google-cloud-storage -numcodecs>=0.7.2 #pin for gt4py, h5py and py3.6 to agree -h5py>=2.10.0 #pin for gt4py, h5py and py3.6 to agree -h5netcdf -dask>=2021.10.0 -numpy>=1.15. #pin for gt4py, h5py, cupy9.1 and py3.6 to agree -toolz diff --git a/util/setup.py b/util/setup.py deleted file mode 100644 index f674b8d8..00000000 --- a/util/setup.py +++ /dev/null @@ -1,54 +0,0 @@ -from typing import List - -from setuptools import find_namespace_packages, setup - - -setup_requirements: List[str] = [] - -requirements = [ - "cftime>=1.2.1", - "numpy>=0.15.0", - "fsspec>=0.6.0", - "typing_extensions>=3.7.4", - "f90nml>=1.1.0", -] - -test_requirements: List[str] = [] - -with open("README.md") as readme_file: - readme = readme_file.read() - - -with open("HISTORY.md") as history_file: - history = history_file.read() - -setup( - author="Allen Institute of Artificial Intelligence", - author_email="jeremym@allenai.org", - python_requires=">=3.8", - classifiers=[ - "Development Status :: 2 - Pre-Alpha", - "Intended Audience :: Developers", - "License :: OSI Approved :: BSD License", - "Natural Language :: English", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - ], - install_requires=requirements, - setup_requires=setup_requirements, - tests_require=test_requirements, - extras_require={ - "netcdf": ["xarray>=0.15.1", "scipy>=1.3.1"], - "zarr": ["zarr>=2.3.2", "xarray>=0.15.1", "scipy>=1.3.1"], - "dace": ["dace>=0.14"], - }, - name="pace-util", - license="BSD license", - long_description=readme + "\n\n" + history, - packages=find_namespace_packages(include=["pace.*"]), - include_package_data=True, - url="https://github.com/ai2cm/pace", - version="0.10.0", - zip_safe=False, -) diff --git a/util/tox.ini b/util/tox.ini deleted file mode 100644 index c4147ffa..00000000 --- a/util/tox.ini +++ /dev/null @@ -1,55 +0,0 @@ -# tox (https://tox.readthedocs.io/) is a tool for running tests -# in multiple virtualenvs. This configuration file will run the -# test suite on all supported python versions. To use it, "pip install tox" -# and then run "tox" from this directory. - -[tox] -envlist = py3 - -[testenv:test_no_extras] -allowlist_externals=make -deps = - # other versions of pytest don't work with subtests - pytest - pytest-subtests - pytest-cov - dask # used for open_mfdataset in a test - netcdf4 - h5netcdf - -e external/gt4py - -c../constraints.txt -# only run a subset of tests (fast, no MPI tests) -# to check import infrastructure works with no extras -setenv = - PYTEST_ARGS = --fast -commands = - make test - - -[testenv:test] -allowlist_externals=make mpirun -deps = - # other versions of pytest don't work with subtests - pytest - pytest-subtests - pytest-cov - dask # used for open_mfdataset in a test - -e external/gt4py - netcdf4 - h5netcdf - mpi4py - -c../constraints.txt -extras = netcdf,zarr -commands = - make test test_mpi - -[testenv:lint] -allowlist_externals=make -skip_install = true -deps = - black - flake8 - mypy - -c../constraints.txt -commands = - make lint