From 8d9371e9f00cf526a5130cc84dd5d7592a48df6d Mon Sep 17 00:00:00 2001 From: Eric Hutton Date: Thu, 17 Oct 2019 22:47:39 -0600 Subject: [PATCH] docs: add table of models (#99) * add list of useful links * add page with available models table * make table with link to binder examples * move installation to install * add __slots__ to grids for new Dataset * add script for creating model table * add link to the notebooks * rename notebooks * resolve cross-references with more than one target * create symbolic link to each notebook * add grid attributes to __slots__ --- README.rst | 9 +- docs/conf.py | 13 ++ docs/examples.rst | 61 ++++---- docs/index.rst | 3 +- docs/{installation.rst => install.rst} | 0 docs/models.rst | 138 ++++++++++++++++++ docs/quickstart.rst | 4 +- docs/scripts/make_table.py | 69 +++++++++ docs/usage.rst | 2 +- .../{ECSnow_PyMT.ipynb => ecsimplesnow.ipynb} | 0 ...ple_01_Basic_Use_GIPL.ipynb => gipl.ipynb} | 0 ...Snow.ipynb => gipl_and_ecsimplesnow.ipynb} | 0 notebooks/{Welcome.ipynb => welcome.ipynb} | 6 +- pymt/framework/bmi_ugrid.py | 16 ++ 14 files changed, 286 insertions(+), 35 deletions(-) rename docs/{installation.rst => install.rst} (100%) create mode 100644 docs/models.rst create mode 100755 docs/scripts/make_table.py rename notebooks/{ECSnow_PyMT.ipynb => ecsimplesnow.ipynb} (100%) rename notebooks/{Example_01_Basic_Use_GIPL.ipynb => gipl.ipynb} (100%) rename notebooks/{Example_02_GIPL_ECSimpleSnow.ipynb => gipl_and_ecsimplesnow.ipynb} (100%) rename notebooks/{Welcome.ipynb => welcome.ipynb} (87%) diff --git a/README.rst b/README.rst index 658e020f..80f216bb 100644 --- a/README.rst +++ b/README.rst @@ -29,15 +29,13 @@ Coverage Status - - Code Health License: MIT Code style: black - + Launch Binder

@@ -62,6 +60,11 @@ that expose the * A plug-in framework for adding additional BMI-enabled models to the framework +Quick links: + * `Installation instructions `_ + * `User documentation `_ + * `List of available models `_ + This material is based upon work supported by the National Science Foundation under Grant No. `1831623`_, diff --git a/docs/conf.py b/docs/conf.py index f58dc82e..7dba65fb 100755 --- a/docs/conf.py +++ b/docs/conf.py @@ -23,6 +23,19 @@ # sys.path.insert(0, os.path.abspath('..')) from unittest.mock import MagicMock +from sphinx.domains.python import PythonDomain + + +class PatchedPythonDomain(PythonDomain): + def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode): + if 'refspecific' in node: + del node['refspecific'] + return super(PatchedPythonDomain, self).resolve_xref( + env, fromdocname, builder, typ, target, node, contnode) + + +def setup(sphinx): + sphinx.override_domain(PatchedPythonDomain) class Mock(MagicMock): diff --git a/docs/examples.rst b/docs/examples.rst index ccd7ace1..4077f316 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -18,35 +18,41 @@ have to install Jupyter Notebook: Single Models ------------- -* Frost Number Model |binder-frost_number| + +======================================================= ===================== +Model Notebook +======================================================= ===================== +:doc:`Frost Number Model ` |binder-frost_number| +:doc:`Kudryavtsev Model ` |binder-ku| +:doc:`GIPL Model ` |binder-GIPL| +:doc:`ECSimpleSnow Model ` |binder-ECSnow| +:doc:`Coastline Evolution Model ` |binder-cem| +:doc:`Hydrotrend ` |binder-hydrotrend| +:doc:`Sedflux3D ` |binder-sedflux3d| +:doc:`Flexural Subsidence ` |binder-subside| +======================================================= ===================== + .. |binder-frost_number| image:: https://mybinder.org/badge_logo.svg :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Ffrost_number.ipynb -* Kudryavtsev Model |binder-ku| .. |binder-ku| image:: https://mybinder.org/badge_logo.svg :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fku.ipynb -* GIPL Model |binder-GIPL| .. |binder-GIPL| image:: https://mybinder.org/badge_logo.svg - :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2FExample_01_Basic_Use_GIPL.ipynb + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fgipl.ipynb -* ECSimpleSnow Model |binder-ECSnow| .. |binder-ECSnow| image:: https://mybinder.org/badge_logo.svg - :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2FECSnow_PyMT.ipynb + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fecsimplesnow.ipynb -* Coastline Evolution Model |binder-cem| .. |binder-cem| image:: https://mybinder.org/badge_logo.svg :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fcem.ipynb -* Hydrotrend |binder-hydrotrend| .. |binder-hydrotrend| image:: https://mybinder.org/badge_logo.svg :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fhydrotrend.ipynb -* Sedflux3D |binder-sedflux3d| .. |binder-sedflux3d| image:: https://mybinder.org/badge_logo.svg :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fsedflux3d.ipynb -* Flexural Subsidence |binder-subside| .. |binder-subside| image:: https://mybinder.org/badge_logo.svg :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fsubside.ipynb @@ -54,13 +60,18 @@ Single Models Coupled Models -------------- -* Coastline Evolution Model + Waves |binder-cem_and_waves| +========================================================================== ======================== +Models Notebook +========================================================================== ======================== +:doc:`Coastline Evolution Model + Waves ` |binder-cem_and_waves| +:doc:`GIPL + ECSimpleSnow Models ` |binder-GIPL_and_ECSnow| +========================================================================== ======================== + .. |binder-cem_and_waves| image:: https://mybinder.org/badge_logo.svg :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fcem_and_waves.ipynb -* GIPL + ECSimpleSnow Models |binder-GIPL_and_ECSnow| .. |binder-GIPL_and_ECSnow| image:: https://mybinder.org/badge_logo.svg - :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2FExample_02_GIPL_ECSimpleSnow.ipynb + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fgipl_and_ecsimplesnow.ipynb .. @@ -71,15 +82,15 @@ Coupled Models :maxdepth: 1 :hidden: - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/docs/index.rst b/docs/index.rst index 40049fea..f5c6358e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -57,8 +57,9 @@ this part of the documentation is for you. :maxdepth: 2 quickstart - installation + install usage + models examples glossary diff --git a/docs/installation.rst b/docs/install.rst similarity index 100% rename from docs/installation.rst rename to docs/install.rst diff --git a/docs/models.rst b/docs/models.rst new file mode 100644 index 00000000..9838e394 --- /dev/null +++ b/docs/models.rst @@ -0,0 +1,138 @@ +.. _available_models: + +Available Models +================ + +The following table lists the models that are currently available through +pymt. + + +================================ ================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================= +.. Summary +================================ ================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================= +Avulsion Avulsion dictates the movement of rivermouths along a coastline by modeling the changes of river channel angles through the floodplain as a stochastic random walk process. +Cem The Coastline Evolution Model addresses predominately sandy, wave-dominated coastlines on time scales ranging from years to millenia and on spatial scales ranging from kilometers to hundreds of kilometers. CEM simulates planview coastline evolution due to wave-driven alongshore sediment transport. This model can incorporate river influence and transport fluvial sediment from one or more point sources along the coastline. + + |binder-Cem| +Child CHILD computes the time evolution of a topographic surface z(x,y,t) by fluvial and hillslope erosion and sediment transport. + + |binder-Child| +ECSimpleSnow ECSimpleSnow was orginally developed by Ross Brown and Bruce Brasnett in Environment Canada (EC). It is an empirical algorithm to melt snow according to the surface temperature and increase in snow depth according to the precipitation that has fallen since the last analysis time. It is a semi-empirical temperature index model. It provides a quick and acceptable answer when you only have very limited inputs. The one deficiency of the model is that it does not take account of the heat budget of the snowpack which means it will melt snow too quickly in the spring. + + |binder-ECSimpleSnow| +ExponentialWeatherer Exponential weathering of bedrock on hillslopes. Uses exponential soil + production function in the style of Ahnert (1976). +Flexure Simulate lithospheric flexure. +FlowAccumulator Component to accumulate flow and calculate drainage area. This is + accomplished by first finding flow directions by a user-specified + method and then calculating the drainage area and discharge. + Optionally, spatially variable runoff can be set either by the + model grid field 'water__unit_flux_in'. +FlowDirectorD8 Single-path (steepest direction) flow direction finding on raster grids by the D8 method. This method considers flow on all eight links such that flow is possible on orthogonal and on diagonal links. +FlowDirectorDINF Directs flow by the D infinity method (Tarboton, 1997). Each node is + assigned two flow directions, toward the two neighboring nodes that are on + the steepest subtriangle. Partitioning of flow is done based on the aspect + of the subtriangle. +FlowDirectorSteepest Find the steepest single-path steepest descent flow + directions. It is equivalent to D4 method in the special case of a raster grid + in that it does not consider diagonal links between nodes. For that capability, + use FlowDirectorD8. +FlowRouter Single-path (steepest direction) flow routing, and calculates flow directions, drainage area, and (optionally) discharge. +FrostNumber From Nelson and Outcalt (1987), the 'frost number', a dimensionless ratio defined by manipulation of either freezing and thawing degree-day sums or frost and thaw penetration depths, can be used to define an unambiguous latitudinal zonation of permafrost continuity. The index is computed using several variables influencing the depth of frost and thaw penetration, and can be related mathematically to the existence and continuity of permafrost. Although the frost number is a useful device for portraying the distribution of contemporary permafrost at continental scales, it is not capable of detecting relict permafrost and should not be mapped over small areas unless numerous climate stations are located in the region of interest. + + |binder-FrostNumber| +GIPL GIPL (Geophysical Institute Permafrost Laboratory) is an implicit + finite difference one-dimensional heat flow numerical model. The + model uses a fine vertical resolution grid which preserves the + latent-heat effects in the phase transition zone, even under + conditions of rapid or abrupt changes in the temperature fields. It + includes upper boundary condition (usually air temperature), + constant geothermal heat flux at the lower boundary (typically from + 500 to 1000 m) and initial temperature distribution with depth. The + other inputs are precipitation, prescribed water content and thermal + properties of the multilayered soil column. As an output the model + produces temperature distributions at different depths, active layer + thickness and calculates time of freeze up. The results include + temperatures at different depths and active layer thickness, + freeze-up days. + + + |binder-GIPL| +Hydrotrend Climate-driven hydrological water balance and transport model that simulates water discharge and sediment load at a river outlet. HydroTrend simulates water and sediment fluxes at a daily timescale based on drainage basin characteristics and climate. HydroTrend can provide this river flux information to other components like CEM and Sedflux2D or Sedflux3D + + |binder-Hydrotrend| +Ku The Kudryavtsev et al. (1974), or Ku model, presents an approximate solution of the Stefan problem. The model provides a steady-state solution under the assumption of sinusoidal air temperature forcing. It considers snow, vegetation, and soil layers as thermal damping to variation of air temperature. The layer of soil is considered to be a homogeneous column with different thermal properties in the frozen and thawed states. The main outputs are annual maximum frozen/thaw depth and mean annual temperature at the top of permafrost (or at the base of the active layer). It can be applied over a wide variety of climatic conditions. + + |binder-Ku| +LinearDiffuser 2D diffusion using an explicit finite-volume method. +OverlandFlow Simulate overland flow using de Almeida approximations. Landlab component + that simulates overland flow using the de Almeida et al., 2012 + approximations of the 1D shallow water equations to be used for + 2D flood inundation modeling. This component calculates discharge, + depth and shear stress after some precipitation event across any raster grid. +Plume Plume simulates the sediment transport and deposition of single-grain size sediment from a river mouth entering into a marine basin by creating a turbulent jet. The model calculates a steady-state hypopycnal plume as a result of river water and sediment discharge based on simplified advection-diffusion equations. The model allows for plume deflection due to systematic coastal currents or Coriolis force +Rafem The River Avulsion and Floodplain Evolution Model (RAFEM) is a cellular model that simulates river and floodplain morphodynamics over large space and timescales. Cell size is larger than the channel belt width, and natural levees, which maintain a bankfull elevation above the channel bed, exist within a river cell. The river course is determined using a steepest-descent methodology, and erosion and deposition along the river profile are modeled as a linear diffusive process. An avulsion occurs when the riverbed becomes super-elevated relative to the surrounding floodplain, but only if the new steepest-descent path to sea level is shorter than the prior river course. If the new path to sea level is not shorter, then a crevasse splay is deposited in the adjacent river cells. The model has been designed to couple with the Coastline Evolution Model through the CSDMS Basic Model Interface. +Sedflux3D Sedflux3D is a basin filling stratigraphic model. Sedflux3d simulates long-term marine sediment transport and accumulation into a three-dimensional basin over time scales of tens of thousands of years. It simulates the dynamics of strata formation of continental margins based on distribution of river plumes and tectonics. + + |binder-Sedflux3D| +SoilMoisture Landlab component that simulates root-zone average soil moisture at each + cell using inputs of potential evapotranspiration, live leaf area index, + and vegetation cover. +StreamPowerEroder A simple, explicit implementation of a stream power algorithm. +Subside The model is used to simulate the lithospheric load changes as the model evolves. Depending upon how the load distribution develops, this flexure can result in the basin uplifting or subsiding (or both). The pattern of subsidence in time and space largely determines the gross geometry of time-bounded units because it controls the rate at which space is created for sedimentation. + + |binder-Subside| +TransportLengthHillslopeDiffuser Hillslope diffusion component in the style of Carretier et al. + (2016, ESurf), and Davy and Lague (2009) +Vegetation Landlab component that simulates net primary productivity, biomass + and leaf area index at each cell based on inputs of root-zone + average soil moisture. + + Zhou, X., Istanbulluoglu, E., & Vivoni, E. R. (2013). Modeling the + ecohydrological role of aspect controlled radiation on tree grass shrub + coexistence in a semiarid climate. Water Resources Research, + 49(5), 2872-2895. +Waves Generates a shallow-water wave climate for a longshore transport module based on a user-defined distribution. + + |binder-Waves| +================================ ================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================= + +.. |binder-ECSimpleSnow| image:: https://mybinder.org/badge_logo.svg + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fecsimplesnow.ipynb + + +.. |binder-Cem| image:: https://mybinder.org/badge_logo.svg + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fcem.ipynb + + +.. |binder-Waves| image:: https://mybinder.org/badge_logo.svg + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fcem_and_waves.ipynb + + +.. |binder-GIPL| image:: https://mybinder.org/badge_logo.svg + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fgipl.ipynb + + +.. |binder-Child| image:: https://mybinder.org/badge_logo.svg + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fchild.ipynb + + +.. |binder-Sedflux3D| image:: https://mybinder.org/badge_logo.svg + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fsedflux3d.ipynb + + +.. |binder-FrostNumber| image:: https://mybinder.org/badge_logo.svg + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Ffrost_number.ipynb + + +.. |binder-Hydrotrend| image:: https://mybinder.org/badge_logo.svg + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fhydrotrend.ipynb + + +.. |binder-Subside| image:: https://mybinder.org/badge_logo.svg + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fsubside.ipynb + + +.. |binder-Ku| image:: https://mybinder.org/badge_logo.svg + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2Fku.ipynb + diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 41fa9d6c..febdf780 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -27,7 +27,7 @@ You can get *pymt* directly from :term:`conda-forge`: $ conda install pymt -c conda-forge Installing into a :term:`conda environment` is strongly recommended. -Check the :doc:`installation guide` for more detailed +Check the :doc:`installation guide` for more detailed information about installing *pymt*. @@ -223,7 +223,7 @@ Now display the plot: :alt: Mean daily water discharge from the Hydrotrend model. A more detailed example of using Hydrotrend -can be found in the :doc:`demos/hydrotrend` +can be found in the :doc:`notebooks/hydrotrend` Jupyter Notebook. An expanded description of the *pymt* methods used in this example can be found in the :doc:`usage` section. diff --git a/docs/scripts/make_table.py b/docs/scripts/make_table.py new file mode 100755 index 00000000..2aa69f30 --- /dev/null +++ b/docs/scripts/make_table.py @@ -0,0 +1,69 @@ +#! /usr/bin/env python +import os +import textwrap +from tabulate import tabulate + +import click +import yaml + + +def construct_rows(notebook_index=None): + import pymt.models + + notebook_index = notebook_index or {} + + rows = [] + for name in pymt.models.__all__: + summary = pymt.models.__dict__[name]().summary + if name in notebook_index: + summary = os.linesep.join( + [ + summary, + "", + "|binder-{0}|".format(name), + ] + ) + rows.append((name, summary)) + + return rows + + +@click.command() +@click.argument("dest", type=click.File("w")) +@click.option( + "--notebook-index", type=click.File("r"), help="index mapping model names to notebooks", +) +def make_table(dest, notebook_index): + if notebook_index: + index = yaml.safe_load(notebook_index) + else: + index = {} + + header = """ + .. _available_models: + + Available Models + ================ + + The following table lists the models that are currently available through + pymt. + + """ + print(textwrap.dedent(header).lstrip(), file=dest) + + rows = construct_rows(notebook_index=index) + print(tabulate(sorted(rows), headers=("Summary",), tablefmt="rst"), file=dest) + + footer = [] + for name, notebooks in index.items(): + footer.append( + """ + .. |binder-{0}| image:: https://mybinder.org/badge_logo.svg + :target: https://mybinder.org/v2/gh/csdms/pymt.git/master?filepath=notebooks%2F{1} + """.format(name, notebooks[0]) + ) + print(textwrap.dedent(os.linesep.join(footer)), file=dest) + + +if __name__ == "__main__": + make_table() diff --git a/docs/usage.rst b/docs/usage.rst index 32b9d3f4..9f863f24 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -9,7 +9,7 @@ configure, run, and couple models. We assume here that you have installed *pymt*, -following the instructions in the :doc:`installation` guide. +following the instructions in the :doc:`install` guide. Below, we'll use the `CEM`_ and `Waves`_ models. Install them with: diff --git a/notebooks/ECSnow_PyMT.ipynb b/notebooks/ecsimplesnow.ipynb similarity index 100% rename from notebooks/ECSnow_PyMT.ipynb rename to notebooks/ecsimplesnow.ipynb diff --git a/notebooks/Example_01_Basic_Use_GIPL.ipynb b/notebooks/gipl.ipynb similarity index 100% rename from notebooks/Example_01_Basic_Use_GIPL.ipynb rename to notebooks/gipl.ipynb diff --git a/notebooks/Example_02_GIPL_ECSimpleSnow.ipynb b/notebooks/gipl_and_ecsimplesnow.ipynb similarity index 100% rename from notebooks/Example_02_GIPL_ECSimpleSnow.ipynb rename to notebooks/gipl_and_ecsimplesnow.ipynb diff --git a/notebooks/Welcome.ipynb b/notebooks/welcome.ipynb similarity index 87% rename from notebooks/Welcome.ipynb rename to notebooks/welcome.ipynb index 04945eae..be7978c2 100644 --- a/notebooks/Welcome.ipynb +++ b/notebooks/welcome.ipynb @@ -10,9 +10,9 @@ "\n", " * [Coastline Evolution Model](cem.ipynb)\n", " * [Coastline Evolution Model + Waves](cem_and_waves.ipynb)\n", - " * [ECSimpleSnow component](ECSnow_PyMT.ipynb)\n", - " * [Geophysical Institute Permafrost Laboratory (GIPL) Model](Example_01_Basic_Use_GIPL.ipynb)\n", - " * [GIPL + ECSimpleSnow](Example_02_GIPL_ECSimpleSnow.ipynb)\n", + " * [ECSimpleSnow component](ecsimplesnow.ipynb)\n", + " * [Geophysical Institute Permafrost Laboratory (GIPL) Model](gipl.ipynb)\n", + " * [GIPL + ECSimpleSnow](gipl_and_ecsimplesnow.ipynb)\n", " * [Frost Number Model](frost_number.ipynb)\n", " * [HydroTrend Model](hydrotrend.ipynb)\n", " * [Kudryavtsev Model](ku.ipynb)\n", diff --git a/pymt/framework/bmi_ugrid.py b/pymt/framework/bmi_ugrid.py index 6f76d814..7a585e1e 100644 --- a/pymt/framework/bmi_ugrid.py +++ b/pymt/framework/bmi_ugrid.py @@ -20,6 +20,8 @@ def coordinate_names(rank): class _Base(xr.Dataset): + __slots__ = "bmi", "grid_id", "grid_type", "ndim", "metadata" + def __init__(self, bmi, grid_id): self.bmi = bmi self.grid_id = grid_id @@ -96,6 +98,8 @@ def set_offset(self, data=None): class Scalar(_Base): + __slots__ = () + def __init__(self, *args): super(Scalar, self).__init__(*args) @@ -114,6 +118,8 @@ def __init__(self, *args): class Vector(_Base): + __slots__ = () + def __init__(self, *args): super(Vector, self).__init__(*args) @@ -132,6 +138,8 @@ def __init__(self, *args): class Points(_Base): + __slots__ = () + def __init__(self, *args): super(Points, self).__init__(*args) @@ -149,6 +157,8 @@ def __init__(self, *args): class Unstructured(_Base): + __slots__ = () + def __init__(self, *args): super(Unstructured, self).__init__(*args) @@ -168,6 +178,8 @@ def __init__(self, *args): class StructuredQuadrilateral(_Base): + __slots__ = () + def __init__(self, *args): super(StructuredQuadrilateral, self).__init__(*args) @@ -203,6 +215,8 @@ def __init__(self, *args): class Rectilinear(_Base): + __slots__ = () + def __init__(self, *args): super(Rectilinear, self).__init__(*args) @@ -238,6 +252,8 @@ def __init__(self, *args): class UniformRectilinear(_Base): + __slots__ = () + def __init__(self, *args): super(UniformRectilinear, self).__init__(*args)