From baaa150cd0a3a5554c021dabde556ae341cf45bd Mon Sep 17 00:00:00 2001 From: Taydra Low Date: Fri, 20 Oct 2023 16:34:09 -0600 Subject: [PATCH 1/3] Changes fieldlist files and adds natl_ocn pod --- data/fieldlist_NCAR.broken.jsonc | 274 +++++++++++++++++++++ data/fieldlist_NCAR.jsonc | 27 +- diagnostics/natl_ocean/doc/gaussians.jpg | Bin 0 -> 35383 bytes diagnostics/natl_ocean/doc/wmt_dummy.rst | 260 ++++++++++++++++++++ diagnostics/natl_ocean/my_tests.jsonc | 140 +++++++++++ diagnostics/natl_ocean/natl_ocean.html | 88 +++++++ diagnostics/natl_ocean/natl_ocean.py | 300 +++++++++++++++++++++++ diagnostics/natl_ocean/natl_wmt.py | 28 +++ diagnostics/natl_ocean/settings.jsonc | 90 +++++++ 9 files changed, 1206 insertions(+), 1 deletion(-) create mode 100644 data/fieldlist_NCAR.broken.jsonc create mode 100644 diagnostics/natl_ocean/doc/gaussians.jpg create mode 100644 diagnostics/natl_ocean/doc/wmt_dummy.rst create mode 100644 diagnostics/natl_ocean/my_tests.jsonc create mode 100644 diagnostics/natl_ocean/natl_ocean.html create mode 100644 diagnostics/natl_ocean/natl_ocean.py create mode 100644 diagnostics/natl_ocean/natl_wmt.py create mode 100644 diagnostics/natl_ocean/settings.jsonc diff --git a/data/fieldlist_NCAR.broken.jsonc b/data/fieldlist_NCAR.broken.jsonc new file mode 100644 index 000000000..0cfc063b1 --- /dev/null +++ b/data/fieldlist_NCAR.broken.jsonc @@ -0,0 +1,274 @@ +// All text to the right of an unquoted "//" is a comment and ignored, as well +// as blank lines (JSONC quasi-standard.) JSON doesn't support line continuation +// in strings, so you'll want to turn word wrap on in your editor. +// +// Source: https://www.cesm.ucar.edu/models/cesm2/atmosphere/docs/ug6/hist_flds_f2000.html +// CF variables not on that list are commented out +{ + "name" : "NCAR", + "models": ["CAM4", "CESM2", "CESM"], // others? + "coords" : { + // only used for taking slices, unit conversion + "lon": {"axis": "X", "standard_name": "longitude", "units": "degrees_east"}, + "lat": {"axis": "Y", "standard_name": "latitude", "units": "degrees_north"}, + "TLONG": {"axis": "X", "standard_name": "array of t-grid longitudes", "units": "degrees_east"}, + "TLAT": {"axis": "Y", "standard_name": "array of t-grid latitudes", "units": "degrees_north"}, + "nlon": {"axis": "X", "standard_name": "xindex", "units": "xindex"}, + "nlat": {"axis": "Y", "standard_name": "yindex", "units": "yindex"}, + "plev": { + "standard_name": "air_pressure", + "units": "hPa", + "positive": "down", + "axis": "Z" + }, + "lev": { + "standard_name": "atmosphere_hybrid_sigma_pressure_coordinate", + "units": "level", // equivalent to '1' + "positive": "down", + "axis": "Z" + }, + "z_t": { + "standard_name": "depth from surface to midpoint of layer", + "units": "centimeters", + "positive": "down", + "axis": "Z" + }, + "time": {"axis": "T", "standard_name": "time", "units": "days"} + }, + "aux_coords": { + // "deptho": { + // "standard_name": "sea_floor_depth_below_geoid", + // "units": "m", + // "ndim": 2 + // }, + // "thkcello": { + // "standard_name": "cell_thickness", + // "units": "m", + // "ndim": 3 + // } + }, + "variables" : { + "U": { + "standard_name": "eastward_wind", + "units": "m s-1", + "scalar_coord_templates": {"plev": "U{value}"}, + "ndim": 4 + }, + "V": { + "standard_name": "northward_wind", + "units": "m s-1", + "scalar_coord_templates": {"plev": "V{value}"}, + "ndim": 4 + }, + "Z3": { + "standard_name": "geopotential_height", + "units": "m", + // note: 4d name is 'Z3' but Z500 = height at 500 mb, etc. + "scalar_coord_templates": {"plev": "Z{value}"}, + "ndim": 4 + }, + "Z500": { + "standard_name": "geopotential_height_500mb", + "units": "m", + // note: 4d name is 'Z3' but Z500 = height at 500 mb, etc. + "ndim": 3 + }, + "Q": { + "standard_name": "specific_humidity", + "units": "1", + "ndim": 4 + }, + "OMEGA": { + "standard_name": "lagrangian_tendency_of_air_pressure", + "units": "Pa s-1", + "scalar_coord_templates": {"plev": "OMEGA{value}"}, + "ndim": 4 + }, + "TS": { + "standard_name": "surface_temperature", + "units": "K", + "ndim": 3 + }, + "PS": { + "standard_name": "surface_air_pressure", + // note: not hPa + "units": "Pa", + "ndim": 3 + }, + "PRECT": { + "standard_name": "precipitation_rate", + "units": "m s-1", + "ndim": 3 + }, + "PRECC": { + "standard_name": "convective_precipitation_rate", + "units": "m s-1", + "ndim": 3 + }, + "TREFHT" : { + // correct name? CMIP6 equivalent should be tas, temp at 2m ref height + "standard_name": "air_temperature", + "units": "K", + "ndim": 3, + "modifier": "atmos_height" + }, + "TAUX": { + "standard_name": "surface_downward_eastward_stress", + "units": "Pa", + "ndim": 3 + }, + "TAUY": { + "standard_name": "surface_downward_northward_stress", + "units": "Pa", + "ndim": 3 + }, + "ndim": 3 + }, + "PSL": { + "standard_name": "air_pressure_at_mean_sea_level", + "units": "Pa", + "ndim": 3 + }, + // radiative fluxes: + // "rsus": { + // "standard_name": "surface_upwelling_shortwave_flux_in_air", + // "units": "W m-2", + // "ndim": 3 + // }, + // "rsds": { + // "standard_name": "surface_downwelling_shortwave_flux_in_air", + // "units": "W m-2", + // "ndim": 3 + // }, + // "rsdt": { + // "standard_name": "toa_incoming_shortwave_flux", + // "units": "W m-2", + // "ndim": 3 + // }, + // "rsut": { + // "standard_name": "toa_outgoing_shortwave_flux", + // "units": "W m-2", + // "ndim": 3 + // }, + "FLUS": { + // correct name? Guessed according to pattern -- no FLUS, only the net combination? + "standard_name": "surface_upwelling_longwave_flux_in_air", + "units": "W m-2", + "ndim": 3 + }, + "FLDS": { + "standard_name": "surface_downwelling_longwave_flux_in_air", + "units": "W m-2", + "ndim": 3 + }, + "FLUT": { + "standard_name": "toa_outgoing_longwave_flux", + "units": "W m-2", + "ndim": 3 + }, + "FLNT": { + "standard_name": "net_upward_longwave_flux", + "units": "W m-2", + "ndim": 3 + }, + "SHFLX": { + "standard_name": "surface_upward_sensible_heat_flux", + "units": "W m-2", + "ndim": 3 + }, + "LHFLX": { + "standard_name": "surface_upward_latent_heat_flux", + "units": "W m-2", + "ndim": 3 + }, + "zos": { + "standard_name": "sea_surface_height_above_geoid", + "units": "m", + "ndim": 3 + }, + "tauuo": { + "standard_name": "surface_downward_x_stress", + "units": "N m-2", + "ndim": 3 + }, + "tauvo": { + "standard_name": "surface_downward_y_stress", + "units": "N m-2", + "ndim": 3 + }, + "areacello": { + "standard_name": "cell_area", + "modifier": "ocean_realm", + "units": "m2", + "ndim": 2 + }, + // Variables for AMOC_3D_Structure module: + // "uo": { + // "standard_name": "sea_water_x_velocity", + // "units": "m s-1" + // }, + // "vo": { + // "standard_name": "sea_water_y_velocity", + // "units": "m s-1" + // }, + // "so": { + // "standard_name": "sea_water_salinity", + // "units": "psu" + // }, + // "umo": { + // "standard_name": "ocean_mass_x_transport", + // "units": "kg s-1" + // }, + // "vmo": { + // "standard_name": "ocean_mass_y_transport", + // "units": "kg s-1" + // }, + "THETAL": { + "standard_name": "sea_water_potential_temperature", + "units": "K", + "ndim": 4 + }, + "SST": { + "standard_name": "Potential Temperature", + "units": "degC", + "ndim": 4 + }, + "SALT": { + "standard_name": "Salinity", + "units": "psu", + "ndim": 4 + }, + "SHF": { + "standard_name": "Surface Heat Flux", + "units": "W/m2", + "ndim": 4 + }, + // Variables for Convective Transition Diagnostics module: + // ta: 3D temperature, units = K: + "T": { + "standard_name": "air_temperature", + "units": "K", + "ndim": 4 + }, + // prw: Column Water Vapor (precipitable water vapor), units = mm (or kg/m^2) + "prw": { + // check name: is this column integrated? + "standard_name": "atmosphere_mass_content_of_water_vapor", + "units": "kg m-2", + "ndim": 3 + } + // "standard_name": "mass_content_of_water_in_soil_layer", + // "units": "kg m-2", + // "ndim": 3 + // }, + // "evspsbl": { + // "standard_name": "water_evapotranspiration_flux", + // "units": "kg m-2 s-1", + // "ndim": 3 + // } + }, + "env_vars" : { + // 0 for CMIP/GFDL date index start, 1 for CESM native date index start + "date_int_offset" : 1 + } +} diff --git a/data/fieldlist_NCAR.jsonc b/data/fieldlist_NCAR.jsonc index 709fdbc06..8358c3a58 100644 --- a/data/fieldlist_NCAR.jsonc +++ b/data/fieldlist_NCAR.jsonc @@ -13,6 +13,8 @@ "lat": {"axis": "Y", "standard_name": "latitude", "units": "degrees_north"}, "TLONG": {"axis": "X", "standard_name": "array of t-grid longitudes", "units": "degrees_east"}, "TLAT": {"axis": "Y", "standard_name": "array of t-grid latitudes", "units": "degrees_north"}, + //"nlon": {"axis": "X", "standard_name": "xindex", "units": "degrees_east"}, + //"nlat": {"axis": "Y", "standard_name": "yindex", "units": "degrees_north"}, "plev": { "standard_name": "air_pressure", "units": "hPa", @@ -198,7 +200,13 @@ "units": "m2", "ndim": 2 }, - // Variables for AMOC_3D_Structure module: + "TAREA": { + "standard_name": "area of T cells", + "modifier": "ocean_realm", + "units": "centimeters^2", + "ndim": 2 + }, + // Variables for AMOC_3D_Structure module: // "uo": { // "standard_name": "sea_water_x_velocity", // "units": "m s-1" @@ -228,6 +236,21 @@ "standard_name": "Potential Temperature", "units": "degC", "ndim": 4 + }, + "SALT": { + "standard_name": "Salinity", + "units": "psu", + "ndim": 4 + }, + "SHF": { + "standard_name": "Surface Heat Flux", + "units": "watts m^-2", + "ndim": 3 + }, + "SFWF": { + "standard_name": "Surface Freshwater Flux", + "units": "kg/m2/s", + "ndim": 3 }, // Variables for Convective Transition Diagnostics module: // ta: 3D temperature, units = K: @@ -260,3 +283,5 @@ "date_int_offset" : 1 } } + + diff --git a/diagnostics/natl_ocean/doc/gaussians.jpg b/diagnostics/natl_ocean/doc/gaussians.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0236250eb4a9380df71949bd3fae4993029c7e7e GIT binary patch literal 35383 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 TLO;iOwPb^j=3Xo4&*J|EfB^3! literal 0 HcmV?d00001 diff --git a/diagnostics/natl_ocean/doc/wmt_dummy.rst b/diagnostics/natl_ocean/doc/wmt_dummy.rst new file mode 100644 index 000000000..3744d1561 --- /dev/null +++ b/diagnostics/natl_ocean/doc/wmt_dummy.rst @@ -0,0 +1,260 @@ +.. This is a comment in RestructuredText format (two periods and a space). + +.. Note that all "statements" and "paragraphs" need to be separated by a blank + line. This means the source code can be hard-wrapped to 80 columns for ease + of reading. Multi-line comments or commands like this need to be indented by + exactly three spaces. + +.. Underline with '='s to set top-level heading: + https://docutils.sourceforge.io/docs/user/rst/quickref.html#section-structure + +Example Diagnostic Documentation +================================ + +Last update: 5/06/2020 + +This is an example document that you can use as a template for your diagnostics' +own documentation: it describes what information you should provide in each +section. For example, if this were a real POD, you'd place a one-paragraph +synopsis of your diagnostic here (like an abstract). + +It also serves as an example of the RestructuredText (ReST, .rst) format used to +generate this page: compare this output with the input `source file +`__. +The easiest way to get started is to copy the source file into the online editor +at `https://livesphinx.herokuapp.com/ `__ and +experiment. + +.. Underline with '-'s to make a second-level heading. + +Version & Contact info +---------------------- + +.. '-' starts items in a bulleted list: + https://docutils.sourceforge.io/docs/user/rst/quickref.html#bullet-lists + +Here you should describe who contributed to the diagnostic, and who should be +contacted for further information: + +- Version/revision information: version 1 (5/06/2020) +- PI (name, affiliation, email) +- Developer/point of contact (name, affiliation, email) +- Other contributors + +.. Underline with '^'s to make a third-level heading. + +Open source copyright agreement +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The MDTF framework is distributed under the LGPLv3 license (see LICENSE.txt). +Unless you've distributed your script elsewhere, you don't need to change this. + +Functionality +------------- + +In this section you should summarize the stages of the calculations your +diagnostic performs, and how they translate to the individual source code files +provided in your submission. This will, e.g., let maintainers fixing a bug or +people with questions about how your code works know where to look. + +Required programming language and libraries +------------------------------------------- + +In this section you should summarize the programming languages and third-party +libraries used by your diagnostic. You also provide this information in the +``settings.jsonc`` file, but here you can give helpful comments to human +maintainers (eg, "We need at least version 1.5 of this library because we call +this function.") + +Required model output variables +------------------------------- + +In this section you should describe each variable in the input data your +diagnostic uses. You also need to provide this in the ``settings.jsonc`` file, +but here you should go into detail on the assumptions your diagnostic makes +about the structure of the data. + +References +---------- + +Here you should cite the journal articles providing the scientific basis for +your diagnostic. To keep the documentation format used in version 2.0 of +the framework, we list references "manually" with the following command: + +.. Note this syntax, which sets the "anchor" for the hyperlink: two periods, one + space, one underscore, the reference tag, and a colon, then a blank line. + +.. code-block:: restructuredtext + + .. _ref-Maloney: + + 1. E. D. Maloney et al. (2019): Process-Oriented Evaluation of Climate + and Weather Forecasting Models. *BAMS*, **100** (9), 1665–1686, + `doi:10.1175/BAMS-D-18-0042.1 `__. + +which produces + +.. _ref-Maloney: + +1. E. D. Maloney et al. (2019): Process-Oriented Evaluation of Climate and +Weather Forecasting Models. *BAMS*, **100** (9), 1665–1686, +`doi:10.1175/BAMS-D-18-0042.1 `__. + +which can be cited in text as ``:ref:`a hyperlink ```, which +gives :ref:`a hyperlink ` to the location of the reference on the +page. Because references are split between this section and the following "More +about this diagnostic" section, unfortunately you'll have to number references +manually. + +We don't enforce any particular bibliographic style, but please provide a +hyperlink to the article's DOI for ease of online access. Hyperlinks are written +as ```link text `__`` (text and url enclosed in backticks, followed by two +underscores). + +More about this diagnostic +-------------------------- + +In this section, you can go into more detail on the science behind your +diagnostic, for example, by copying in relevant text articles you've written +using th It's especially helpful if you're able to teach users how to use +your diagnostic's output, by showing how to interpret example plots. + +Instead of doing that here, we provide more examples of RestructuredText +syntax that you can customize as needed. + +As mentioned above, we recommend the online editor at `https://livesphinx.herokuapp.com/ +`__, which gives immediate feedback and has +support for sphinx-specific commands. + +Here's an +`introduction `__ +to the RestructuredText format, a +`quick reference `__, +and a `syntax comparison `__ to +other text formats you may be familiar with. + +Links to external sites +^^^^^^^^^^^^^^^^^^^^^^^ + +URLs written out in the text are linked automatically: https://ncar.ucar.edu/. + +To use custom text for the link, use the syntax +```link text `__`` (text and url enclosed in backticks, +followed by two underscores). This produces `link text `__. + +More references and citations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Here's another reference: + +.. code-block:: restructuredtext + + .. _ref-Charney: + + 2. Charney, Jule; Fjørtoft, Ragnar; von Neumann, John (1950). Numerical + Integration of the Barotropic Vorticity Equation. *Tellus* **2** (4) 237–254, + `doi:10.3402/tellusa.v2i4.8607 `__. + +.. _ref-Charney: + +2. Charney, Jule; Fjørtoft, Ragnar; von Neumann, John (1950). Numerical +Integration of the Barotropic Vorticity Equation. *Tellus* **2** (4) 237–254, +`doi:10.3402/tellusa.v2i4.8607 `__. + +Here's an example of citing these references: + +.. code-block:: restructuredtext + + :ref:`Maloney et. al., 2019 `, + :ref:`Charney, Fjørtoft and von Neumann, 1950 ` + +produces :ref:`Maloney et. al., 2019 `, +:ref:`Charney, Fjørtoft and von Neumann, 1950 `. + +Figures +^^^^^^^ + +Images **must** be provided in either .png or .jpeg formats in order to be +displayed properly in both the html and pdf output. + +Here's the syntax for including a figure in the document: + +.. code-block:: restructuredtext + + .. _my-figure-tag: [only needed for linking to figures] + + .. figure:: [path to image file, relative to the source.rst file] + :align: left + :width: 75 % [these both need to be indented by three spaces] + + Paragraphs or other text following the figure that are indented by three + spaces are treated as a caption/legend, eg: + + - red line: a Gaussian + - blue line: another Gaussian + +which produces + +.. _my-figure-tag: + +.. figure:: gaussians.jpg + :align: left + :width: 75 % + + Paragraphs or other text following the figure that are indented by three + spaces are treated as a caption/legend, eg: + + - blue line: a Gaussian + - orange line: another Gaussian + +The tag lets you refer to figures in the text, e.g. +``:ref:`Figure 1 ``` → :ref:`Figure 1 `. + +Equations +^^^^^^^^^ + +Accented and Greek letters can be written directly using Unicode: é, Ω. +(Make sure your text editor is saving the file in UTF-8 encoding). + +Use the following syntax for superscripts and subscripts in in-line text: + +.. code-block:: restructuredtext + + W m\ :sup:`-2`\ ; CO\ :sub:`2`\ . + +which produces: W m\ :sup:`-2`\ ; CO\ :sub:`2`\ . +Note one space is needed after both forward slashes in the input; these spaces +are not included in the output. + +Equations can be written using standard +`latex `__ +(PDF link) syntax. Short equations in-line with the text can be written as +``:math:`f = 2 \Omega \sin \phi``` → :math:`f = 2 \Omega \sin \phi`. + +Longer display equations can be written as follows. Note that a blank line is +needed after the ``.. math::`` heading and after each equation, with the +exception of aligned equations. + +.. code-block:: restructuredtext + + .. math:: + + \frac{D \mathbf{u}_g}{Dt} + f_0 \hat{\mathbf{k}} \times \mathbf{u}_a &= 0; \\ + \frac{Dh}{Dt} + f \nabla_z \cdot \mathbf{u}_a &= 0, + + \text{where } \mathbf{u}_g = \frac{g}{f_0} \hat{\mathbf{k}} \times \nabla_z h. + +which produces: + +.. math:: + + \frac{D \mathbf{u}_g}{Dt} + f_0 \hat{\mathbf{k}} \times \mathbf{u}_a &= 0; \\ + \frac{Dh}{Dt} + f \nabla_z \cdot \mathbf{u}_a &= 0, + + \text{where } \mathbf{u}_g = \frac{g}{f_0} \hat{\mathbf{k}} \times \nabla_z h. + +The editor at `https://livesphinx.herokuapp.com/ +`__ can have issues formatting complicated +equations, so you may want to check its output with a latex-specific editor, +such as `overleaf `__ or other `equation editors +`__. diff --git a/diagnostics/natl_ocean/my_tests.jsonc b/diagnostics/natl_ocean/my_tests.jsonc new file mode 100644 index 000000000..42e4c4be7 --- /dev/null +++ b/diagnostics/natl_ocean/my_tests.jsonc @@ -0,0 +1,140 @@ +// Configuration for MDTF-diagnostics driver script self-test. +// +// Copy this file and customize the settings as needed to run the framework on +// your own model output without repeating command-line options. Pass it to the +// framework at the end of the command line (positionally) or with the +// -f/--input-file flag. Any other explicit command line options will override +// what's listed here. +// +// All text to the right of an unquoted "//" is a comment and ignored, as well +// as blank lines (JSONC quasi-standard.) +{ + "case_list" : [ + // The cases below correspond to the different sample model data sets. Note + // that the MDTF package does not currently support analyzing multiple + // models in a single invocation. Comment out or delete the first entry and + // uncomment the second to run NOAA-GFDL-AM4 only for the MJO_prop_amp POD, + // and likewise for the SM_ET_coupling POD. + { + // "CASENAME" : "QBOi.EXP1.AMIP.001", + // "CASENAME" : "DUMMY", + "CASENAME" : "b.e21.BHIST.f09_g17.CMIP6-historical.001", + "model" : "CESM", + "convention" : "CESM", + "FIRSTYR" : 1850, + "LASTYR" : 1851, + "pod_list": [ + // Optional: PODs to run for this model only (defaults to all) + "natl_ocean" + //"Wheeler_Kiladis", + //"EOF_500hPa", + //"MJO_suite", + //"MJO_teleconnection" + // "convective_transition_diag", + // "precip_diurnal_cycle", + // "ocn_surf_flux_diag", + // "mixed_layer_depth", + // "tropical_pacific_sea_level", + // "temp_extremes_distshape", + // "precip_buoy_diag" + ] + } + // { + // "CASENAME" : "GFDL.CM4.c96L32.am4g10r8", + // "model" : "AM4", + // "convention" : "GFDL", + // "FIRSTYR" : 1, + // "LASTYR" : 10, + // "pod_list" : ["MJO_prop_amp"] + // } + // { + // "CASENAME" : "Lmon_GISS-E2-H_historical_r1i1p1", + // "model" : "CMIP", + // "convention" : "CMIP", + // "FIRSTYR" : 1951, + // "LASTYR" : 2005, + // "pod_list" : ["SM_ET_coupling"] + // } + // { + // "CASENAME" : "NCAR-CAM5.timeslice", + // "model" : "CESM", + // "convention" : "CMIP", + // "FIRSTYR" : 2000, + // "LASTYR" : 2004, + // "pod_list": ["example"] + // } + ], + // PATHS --------------------------------------------------------------------- + // Location of supporting data downloaded when the framework was installed. + + // If a relative path is given, it's resolved relative to the MDTF-diagnostics + // code directory. Environment variables (eg, $HOME) can be referenced with a + // "$" and will be expended to their current values when the framework runs. + + // Parent directory containing observational data used by individual PODs. + "OBS_DATA_ROOT": "../inputdata/obs_data/", + + // Parent directory containing results from different models. + "MODEL_DATA_ROOT": "../inputdata/model/", + + // Working directory. Defaults to OUTPUT_DIR if blank. + //"WORKING_DIR": "../wkdir", + "WORKING_DIR": "/glade/scratch/taydral/MDTFwkdir", + + // Directory to write output. The results of each run of the framework will be + // put in a subdirectory of this directory. +// "OUTPUT_DIR": "../wkdir", + "OUTPUT_DIR": "/glade/scratch/taydral/MDTFwkdir", + + // Location of the Anaconda/miniconda installation to use for managing + // dependencies (path returned by running `conda info --base`.) If empty, + // framework will attempt to determine location of system's conda installation. + "conda_root": "/glade/u/home/taydral/miniconda3", + + // Directory containing the framework-specific conda environments. This should + // be equal to the "--env_dir" flag passed to conda_env_setup.sh. If left + // blank, the framework will look for its environments in the system default + // location. + "conda_env_root": "/glade/u/home/taydral/miniconda3/envs", + + // SETTINGS ------------------------------------------------------------------ + // Any command-line option recognized by the mdtf script (type `mdtf --help`) + // can be set here, in the form "flag name": "desired setting". + + // Method used to fetch model data. + "data_manager": "Local_File", + + // Type of data that POD(s) will analyze + // "single_run" (default) or "multi_run" + "data_type": "single_run", + + // Method used to manage dependencies. + "environment_manager": "Conda", + + // Settings affecting what output is generated: + + // Set to true to have PODs save postscript figures in addition to bitmaps. + "save_ps": false, + + // Set to true to have PODs save netCDF files of processed data. + "save_nc": false, + + // Set to true to save HTML and bitmap plots in a .tar file. + "make_variab_tar": true, + + // Set to true to overwrite results in OUTPUT_DIR; otherwise results saved + // under a unique name. + "overwrite": false, + + // Settings used in debugging: + + // Log verbosity level. + "verbose": 1, + + // Set to true for framework test. Data is fetched but PODs are not run. + "test_mode": false, + + // Set to true for framework test. No external commands are run and no remote + // data is copied. Implies test_mode. + "dry_run": false +} diff --git a/diagnostics/natl_ocean/natl_ocean.html b/diagnostics/natl_ocean/natl_ocean.html new file mode 100644 index 000000000..6b21ed150 --- /dev/null +++ b/diagnostics/natl_ocean/natl_ocean.html @@ -0,0 +1,88 @@ + +MDTF example diagnostic + +

Example diagnostic: time-averaged near-surface temperature

+

+If this were a real diagnostic, this would be where you'd give a brief summary +of what your diagnostic computes and how to interpret the output plots it +generated, which will be linked below. You can include hyperlinks to journal +articles, etc. for more detailed documentation on your methods or sources of +observational data. +

+

+The names of any environment variables set for the diagnostic (enclosed in +curly braces) will be replaced by the same values they had when the diagnostic +was run. For example, this diagnostic's favorite color is "{{EXAMPLE_FAV_COLOR}}." +

+ + + + + + + + + + + + + + + + +
Time averages, {{FIRSTYR}}-{{LASTYR}} +{{CASENAME}} +MODEL +
SST (degC) +plot +
Top layer salt (psu) +plot + +
Bias plots, {{FIRSTYR}}-{{LASTYR}} +{{CASENAME}} +MODEL +
SST (degC) +plot +
Top layer salt (psu) +plot + +
WMT plots, {{FIRSTYR}}-{{LASTYR}} +{{CASENAME}} +MODEL +
SST (degC) +plot +
Top layer salt (psu) +plot + +
MOC plots, {{FIRSTYR}}-{{LASTYR}} +{{CASENAME}} +MODEL +
SST (degC) +plot +
Top layer salt (psu) +plot + +
Synthesis plots, {{FIRSTYR}}-{{LASTYR}} +{{CASENAME}} +MODEL +
SST (degC) +plot +
Top layer salt (psu) +plot + + + +
+ diff --git a/diagnostics/natl_ocean/natl_ocean.py b/diagnostics/natl_ocean/natl_ocean.py new file mode 100644 index 000000000..83649613f --- /dev/null +++ b/diagnostics/natl_ocean/natl_ocean.py @@ -0,0 +1,300 @@ +# MDTF North Atlantic Ocean POD +# ================================================================================ +# This script does a simple diagnostic calculation to illustrate how to adapt code +# for use in the MDTF diagnostic framework. The main change is to set input/output +# paths, variable names etc. from shell environment variables the framework +# provides, instead of hard-coding them. +# +# Below, this script consists of 2 parts: (1) a template of comprehensive header POD +# developers must include in their POD's main driver script, (2) actual code, and +# (3) extensive in-line comments. +# ================================================================================ +# +# This file is part of the Example Diagnostic POD of the MDTF code package (see mdtf/MDTF-diagnostics/LICENSE.txt) +# +# Example Diagnostic POD +# +# Last update: 8/1/2020 +# +# This is a example POD that you can use as a template for your diagnostics. +# If this were a real POD, you'd place a one-paragraph synopsis of your +# diagnostic here (like an abstract). +# +# Version & Contact info +# +# Here you should describe who contributed to the diagnostic, and who should be +# contacted for further information: +# +# - Version/revision information: version 1 (5/06/2020) +# - PI (name, affiliation, email) +# - Developer/point of contact (name, affiliation, email) +# - Other contributors +# +# Open source copyright agreement +# +# The MDTF framework is distributed under the LGPLv3 license (see LICENSE.txt). +# Unless you've distirbuted your script elsewhere, you don't need to change this. +# +# Functionality +# +# In this section you should summarize the stages of the calculations your +# diagnostic performs, and how they translate to the individual source code files +# provided in your submission. This will, e.g., let maintainers fixing a bug or +# people with questions about how your code works know where to look. +# +# Required programming language and libraries +# +# In this section you should summarize the programming languages and third-party +# libraries used by your diagnostic. You also provide this information in the +# ``settings.jsonc`` file, but here you can give helpful comments to human +# maintainers (eg, "We need at least version 1.5 of this library because we call +# this function.") +# +# Required model output variables +# +# In this section you should describe each variable in the input data your +# diagnostic uses. You also need to provide this in the ``settings.jsonc`` file, +# but here you should go into detail on the assumptions your diagnostic makes +# about the structure of the data. +# +# References +# +# Here you should cite the journal articles providing the scientific basis for +# your diagnostic. +# +# Maloney, E. D, and Co-authors, 2019: Process-oriented evaluation of climate +# and wether forcasting models. BAMS, 100(9), 1665-1686, +# doi:10.1175/BAMS-D-18-0042.1. +# +import os +import matplotlib +matplotlib.use('Agg') # non-X windows backend +# Commands to load third-party libraries. Any code you don't include that's +# not part of your language's standard library should be listed in the +# settings.jsonc file. +import xarray as xr # python library we use to read netcdf files +import matplotlib.pyplot as plt # python library we use to make plots +import xwmt +import numpy as np +from natl_wmt import wmt_calc + + +### 1) Loading model data files: ############################################### +# +# The framework copies model data to a regular directory structure of the form +# //...nc +# Here and frequency are requested in the "varlist" part of +# settings.json. + +# The following command sets input_path to the value of the shell environment +# variable called TAS_FILE. This variable is set by the framework to let the +# script know where the locally downloaded copy of the data for this variable +# (which we called "tas") is. +sst_path = os.environ["SST_FILE"] +salt_path = os.environ["SALT_FILE"] +shf_path = os.environ["SHF_FILE"] +sfwf_path = os.environ["SFWF_FILE"] +tarea_path = os.environ["TAREA_FILE"] + +wk_dir = "{WK_DIR}".format(**os.environ) +obs_dir = "{OBS_DATA}/".format(**os.environ) +output_dir = wk_dir+'/model/' +figures_dir = wk_dir+'/model/' +modelname = "{CASENAME}".format(**os.environ) + + + +# command to load the netcdf file +sst_dataset = xr.open_dataset(sst_path) +salt_dataset = xr.open_dataset(salt_path) +shf_dataset = xr.open_dataset(shf_path) +sfwf_dataset = xr.open_dataset(sfwf_path) +tarea_dataset = xr.open_dataset(tarea_path) + +### 2) Doing computations: ##################################################### +# +# Diagnostics in the framework are intended to work with native output from a +# variety of models. For this reason, variable names should not be hard-coded +# but instead set from environment variables. +# +sst_var_name = os.environ["SST_var"] +salt_var_name = os.environ["SALT_var"] +shf_var_name = os.environ["SHF_var"] +sfwf_var_name = os.environ["SFWF_var"] +tarea_var_name = os.environ["TAREA_var"] +#wmt_var_name = "WMT" + +# For safety, don't even assume that the time dimension of the input file is +# named "time": +time_coord_name = os.environ["time_coord"] +depth_coord_name = os.environ["z_t_coord"] + +# Set variable arrays +sst_data = sst_dataset[sst_var_name] +sss_data = salt_dataset[salt_var_name].isel({depth_coord_name:0}) +shf_data = shf_dataset[shf_var_name] +sfwf_data = sfwf_dataset[sfwf_var_name] +tarea_data = sfwf_dataset[tarea_var_name] + +# The only computation done here: compute the time average of input data +model_mean_sst = sst_data.mean(time_coord_name) +model_mean_sss = sss_data.mean(time_coord_name) +model_mean_shf = shf_data.mean(time_coord_name) +model_mean_sfwf = sfwf_data.mean(time_coord_name) + +##bias script goes here + +## WMT calculation ## +#1)Create dataset for xwmt +wmt_ds=sst_data.to_dataset(name='tos') +wmt_ds['sos'] = sss_data +wmt_ds['hfds'] = shf_data +wmt_ds['wfo'] = sfwf_data +wmt_ds['wet'] = xr.where(~np.isnan(wmt_ds.tos),1,0) +wmt_ds['sfdsi'] = xr.zeros_like(wmt_ds['hfds']).rename('sfdsi') +wmt_ds['areacello'] = tarea_data/100e2 +wmt_ds = wmt_ds.drop({'ULAT','ULONG'}) +wmt_ds = wmt_ds.rename({'nlat': 'y', 'nlon':'x', 'TLAT':'lat', 'TLONG':'lon'}) + +#2)Calculate WMT +model_mean_wmt = wmt_calc(wmt_ds) + +##MOC script goes here + +##Synthesis script goes here + + +# Note that we supplied the observational data as time averages, to save space +# and avoid having to repeat that calculation each time the diagnostic is run. + +# Logging relevant debugging or progress information is a good idea. Anything +# your diagnostic prints to STDOUT will be saved to its own log file. +print("Computed time average of {SST_var} for {CASENAME}.".format(**os.environ)) + +### 3) Saving output data: ##################################################### +# +# Diagnostics should write output data to disk to a) make relevant results +# available to the user for further use or b) to pass large amounts of data +# between stages of a calculation run as different sub-scripts. Data can be in +# any format (as long as it's documented) and should be written to the +# directory /model/netCDF (created by the framework). +# +sst_out_path = output_dir+"/netCDF/sst_means.nc".format(**os.environ) +sss_out_path = output_dir+"/netCDF/sss_means.nc".format(**os.environ) +shf_out_path = output_dir+"/netCDF/shf_means.nc".format(**os.environ) +sfwf_out_path = output_dir+"/netCDF/sfwf_means.nc".format(**os.environ) +tarea_out_path = output_dir+"/netCDF/tarea.nc".format(**os.environ) +wmt_out_path = output_dir+"/netCDF/wmt_mean.nc".format(**os.environ) +print('pathsmade') + +# write out time averages as a netcdf file +model_mean_sst.to_netcdf(sst_out_path) +model_mean_sss.to_netcdf(sss_out_path) +model_mean_shf.to_netcdf(shf_out_path) +model_mean_sfwf.to_netcdf(sfwf_out_path) +tarea_data.to_netcdf(tarea_out_path) +model_mean_wmt.to_netcdf(wmt_out_path) +print('filessaved') + + +### 4) Saving output plots: #################################################### +# +# Plots should be saved in EPS or PS format at //PS +# (created by the framework). Plots can be given any filename, but should have +# the extension ".eps" or ".ps". To make the webpage output, the framework will +# convert these to bitmaps with the same name but extension ".png". + +# Define a python function to make the plot, since we'll be doing it twice and +# we don't want to repeat ourselves. +def plot_and_save_figure(model_or_obs, title_string, fieldname, dataset): + # initialize the plot + plt.figure(figsize=(12,6)) + plot_axes = plt.subplot(1,1,1) + # actually plot the data (makes a lat-lon colormap) + dataset.plot(ax = plot_axes) + plot_axes.set_title(title_string) + # save the plot in the right location + plot_path = "{WK_DIR}/{model_or_obs}/example_{model_or_obs}_{fieldname}_plot.png".format( + model_or_obs=model_or_obs, fieldname=fieldname, **os.environ + ) + plt.savefig(plot_path, bbox_inches='tight') +# end of function + +# set an informative title using info about the analysis set in env vars +title_string = "{CASENAME}: mean {SST_var} ({FIRSTYR}-{LASTYR})".format(**os.environ) +# Plot the model data: +plot_and_save_figure("model", title_string, sst_var_name, model_mean_sst) + +title_string = "{CASENAME}: mean {SALT_var} ({FIRSTYR}-{LASTYR})".format(**os.environ) +plot_and_save_figure("model", title_string, salt_var_name, model_mean_sss) + +title_string = "{CASENAME}: mean {SHF_var} ({FIRSTYR}-{LASTYR})".format(**os.environ) +plot_and_save_figure("model", title_string, shf_var_name, model_mean_shf) + +title_string = "{CASENAME}: mean {SFWF_var} ({FIRSTYR}-{LASTYR})".format(**os.environ) +plot_and_save_figure("model", title_string, sfwf_var_name, model_mean_sfwf) + +title_string = "{CASENAME}: {TAREA_var} ".format(**os.environ) +plot_and_save_figure("model", title_string, tarea_var_name, tarea_data) + +#title_string = "{CASENAME}: WMT ".format(**os.environ) +#plot_and_save_figure("model", title_string, wmt_var_name, model_mean_wmt.wmt) +print('plots saved') + +plt.figure(figsize=(12,6)) +plot_axes = plt.subplot(1,1,1) +# actually plot the data (makes a lat-lon colormap) +model_mean_wmt.wmt.plot(ax = plot_axes) +title_string = "{CASENAME}: WMT ".format(**os.environ) +plot_axes.set_title(title_string) +plot_axes.set_xlabel(r'$\sigma_{2}$ (kg/m$^{3}$)') +plot_axes.set_ylabel('WMT (Sv)') +# save the plot in the right location +plot_path = "{WK_DIR}/model/example_model_WMT_plot.png".format(**os.environ) +plt.savefig(plot_path, bbox_inches='tight') + + +### 5) Loading obs data files & plotting obs figures: ########################## +# +# If your diagnostic uses any model-independent supporting data (eg. reference +# or observational data) larger than a few kB of text, it should be provided via +# the observational data distribution instead of being included with the source +# code. This data can be in any format: the framework doesn't process it. The +# environment variable OBS_DATA will be set to a path where the framework has +# copied a directory containing your supplied data. +# +# The following command replaces the substring "{OBS_DATA}" with the value of +# the OBS_DATA environment variable. +obs_path = "{OBS_DATA}/SST/sst.mnmean.nc".format(**os.environ) + +# command to load the netcdf file +obs_dataset = xr.open_dataset(obs_path) + + +obs_mean_sst = obs_dataset['sst'].mean('time') + +# Plot the observational data: +title_string = "Observations: mean {SST_var}".format(**os.environ) +plot_and_save_figure("obs", title_string, sst_var_name, obs_mean_sst) + + +### 6) Cleaning up: ############################################################ +# +# In addition to your language's normal housekeeping, don't forget to delete any +# temporary/scratch files you created in step 4). +# +model_dataset.close() +obs_dataset.close() + + +### 7) Error/Exception-Handling Example ######################################## +nonexistent_file_path = "{DATADIR}/mon/nonexistent_file.nc".format(**os.environ) +try: + nonexistent_dataset = xr.open_dataset(nonexistent_file_path) +except IOError as error: + print(error) + print("This message is printed by the example POD because exception-handling is working!") + + +### 8) Confirm POD executed sucessfully ######################################## +print("Last log message by Example POD: finished successfully!") diff --git a/diagnostics/natl_ocean/natl_wmt.py b/diagnostics/natl_ocean/natl_wmt.py new file mode 100644 index 000000000..59c26ec5d --- /dev/null +++ b/diagnostics/natl_ocean/natl_wmt.py @@ -0,0 +1,28 @@ +import os +# non-X windows backend +# Commands to load third-party libraries. Any code you don't include that's +# not part of your language's standard library should be listed in the +# settings.jsonc file. +import xarray as xr # python library we use to read netcdf files +import xwmt +import numpy as np + +## insert function description ## + +def wmt_calc(ds): + lon = ds['lon'] + lon = lon.where(lon<180.,other=lon-360.) + lat = ds['lat'] + SPNA = ds.where((lat>=40) & (lat<=80) & (lon>=-65.) & (lon<=15.)) + + #2)Calculate WMT using xwmt + wmt_init = xwmt.swmt(SPNA) + wmt_spna = wmt_init.G('sigma2', bins=np.linspace(33.1,38)) + + #time average of WMT + time_coord_name = os.environ["time_coord"] + wmt_spna_mean = wmt_spna.mean(time_coord_name)/1e6 + + #wmt to dataset + wmt_spna_mean_ds = wmt_spna_mean.to_dataset(name='wmt') + return wmt_spna_mean_ds diff --git a/diagnostics/natl_ocean/settings.jsonc b/diagnostics/natl_ocean/settings.jsonc new file mode 100644 index 000000000..ca6a3f8b2 --- /dev/null +++ b/diagnostics/natl_ocean/settings.jsonc @@ -0,0 +1,90 @@ +// Example MDTF diagnostic settings file +// +// This should be an ascii text file in JSON format +// (https://en.wikipedia.org/wiki/JSON#Data_types_and_syntax), with the addition +// that all text to the right of a "//" is a comment and ignored (sometimes +// called "JSONC" format). +// +{ + "settings" : { + "driver" : "natl_ocean.py", + "long_name" : "Subtropical to Subpolar North Atlantic Ocean Diagnostics", + "realm" : "ocean", + "description" : "Subtropical to Subpolar North Atlantic Ocean Diagnostics", + + // (optional) Any diagnostic-specific environment variables, given as + // key:value pairs. The user can't change these at runtime, but they can be + // used to set site-specific installation settings for your diagnostic. + "pod_env_vars" : { + "EXAMPLE_FAV_COLOR": "blue" + }, + + // Programs and third-party libraries your diagnostic needs to run. This is + // a set of key:value pairs, where "key" is the name of a language's + // executable and "value" is a list of all the libraries that language needs. + // The framework will ensure everything listed here is on your diagnostic's + // $PATH when it runs. + "runtime_requirements": { + "python3": ["matplotlib", "xarray", "netCDF4"] + } + }, + + // In this section, you define the names and units for the coordinates used by + // the variables defined below in the "varlist" section. Names in the + // "dimensions" attribute for each variable must correspond to a coordinate + // named here. + "dimensions": { + "time": {"standard_name": "time"}, + "TLONG": { + "standard_name": "array of t-grid longitudes", + "axis": "X" + }, + "TLAT": { + "standard_name": "array of t-grid latitudes", + "axis": "Y" + }, + "z_t": { + "standard_name": "depth from surface to midpoint of layer", + "axis": "Z", + "units": "centimeters", + "positive": "down" + } + }, + + // In this section, you describe what model data your diagnostic uses. Add one + // list entry (the section in curly braces) for each variable, separated by + // commas. + "varlist" : { + "SST": { + "standard_name" : "Potential Temperature", + "units": "degC", + "frequency" : "mon", + "dimensions": ["time", "z_t", "TLAT", "TLONG"] + }, + "SALT": { + "standard_name" : "Salinity", + "units": "psu", + "frequency" : "mon", + "dimensions": ["time", "z_t", "TLAT", "TLONG"] + }, + "SHF": { + "standard_name" : "Surface Heat Flux", + "units": "W/m2", + "frequency" : "mon", + "dimensions": ["time", "TLAT", "TLONG"] + }, + "SFWF": { + "standard_name" : "Surface Freshwater Flux", + "units": "kg/m2/s", + "frequency" : "mon", + "dimensions": ["time", "TLAT", "TLONG"] + }, + "TAREA": { + "standard_name" : "area of T cells", + "units": "centimeters^2", + "dimensions": ["TLAT", "TLONG"] + } + + // If we needed a second variable, we'd list it here. + } +} From 728e83291ec77552d011a8d6d373bab76ad5330a Mon Sep 17 00:00:00 2001 From: Taydra Low Date: Fri, 20 Oct 2023 16:44:15 -0600 Subject: [PATCH 2/3] removed fieldlist_NCAR.broken.jsonc file --- data/fieldlist_NCAR.broken.jsonc | 274 ------------------------------- 1 file changed, 274 deletions(-) delete mode 100644 data/fieldlist_NCAR.broken.jsonc diff --git a/data/fieldlist_NCAR.broken.jsonc b/data/fieldlist_NCAR.broken.jsonc deleted file mode 100644 index 0cfc063b1..000000000 --- a/data/fieldlist_NCAR.broken.jsonc +++ /dev/null @@ -1,274 +0,0 @@ -// All text to the right of an unquoted "//" is a comment and ignored, as well -// as blank lines (JSONC quasi-standard.) JSON doesn't support line continuation -// in strings, so you'll want to turn word wrap on in your editor. -// -// Source: https://www.cesm.ucar.edu/models/cesm2/atmosphere/docs/ug6/hist_flds_f2000.html -// CF variables not on that list are commented out -{ - "name" : "NCAR", - "models": ["CAM4", "CESM2", "CESM"], // others? - "coords" : { - // only used for taking slices, unit conversion - "lon": {"axis": "X", "standard_name": "longitude", "units": "degrees_east"}, - "lat": {"axis": "Y", "standard_name": "latitude", "units": "degrees_north"}, - "TLONG": {"axis": "X", "standard_name": "array of t-grid longitudes", "units": "degrees_east"}, - "TLAT": {"axis": "Y", "standard_name": "array of t-grid latitudes", "units": "degrees_north"}, - "nlon": {"axis": "X", "standard_name": "xindex", "units": "xindex"}, - "nlat": {"axis": "Y", "standard_name": "yindex", "units": "yindex"}, - "plev": { - "standard_name": "air_pressure", - "units": "hPa", - "positive": "down", - "axis": "Z" - }, - "lev": { - "standard_name": "atmosphere_hybrid_sigma_pressure_coordinate", - "units": "level", // equivalent to '1' - "positive": "down", - "axis": "Z" - }, - "z_t": { - "standard_name": "depth from surface to midpoint of layer", - "units": "centimeters", - "positive": "down", - "axis": "Z" - }, - "time": {"axis": "T", "standard_name": "time", "units": "days"} - }, - "aux_coords": { - // "deptho": { - // "standard_name": "sea_floor_depth_below_geoid", - // "units": "m", - // "ndim": 2 - // }, - // "thkcello": { - // "standard_name": "cell_thickness", - // "units": "m", - // "ndim": 3 - // } - }, - "variables" : { - "U": { - "standard_name": "eastward_wind", - "units": "m s-1", - "scalar_coord_templates": {"plev": "U{value}"}, - "ndim": 4 - }, - "V": { - "standard_name": "northward_wind", - "units": "m s-1", - "scalar_coord_templates": {"plev": "V{value}"}, - "ndim": 4 - }, - "Z3": { - "standard_name": "geopotential_height", - "units": "m", - // note: 4d name is 'Z3' but Z500 = height at 500 mb, etc. - "scalar_coord_templates": {"plev": "Z{value}"}, - "ndim": 4 - }, - "Z500": { - "standard_name": "geopotential_height_500mb", - "units": "m", - // note: 4d name is 'Z3' but Z500 = height at 500 mb, etc. - "ndim": 3 - }, - "Q": { - "standard_name": "specific_humidity", - "units": "1", - "ndim": 4 - }, - "OMEGA": { - "standard_name": "lagrangian_tendency_of_air_pressure", - "units": "Pa s-1", - "scalar_coord_templates": {"plev": "OMEGA{value}"}, - "ndim": 4 - }, - "TS": { - "standard_name": "surface_temperature", - "units": "K", - "ndim": 3 - }, - "PS": { - "standard_name": "surface_air_pressure", - // note: not hPa - "units": "Pa", - "ndim": 3 - }, - "PRECT": { - "standard_name": "precipitation_rate", - "units": "m s-1", - "ndim": 3 - }, - "PRECC": { - "standard_name": "convective_precipitation_rate", - "units": "m s-1", - "ndim": 3 - }, - "TREFHT" : { - // correct name? CMIP6 equivalent should be tas, temp at 2m ref height - "standard_name": "air_temperature", - "units": "K", - "ndim": 3, - "modifier": "atmos_height" - }, - "TAUX": { - "standard_name": "surface_downward_eastward_stress", - "units": "Pa", - "ndim": 3 - }, - "TAUY": { - "standard_name": "surface_downward_northward_stress", - "units": "Pa", - "ndim": 3 - }, - "ndim": 3 - }, - "PSL": { - "standard_name": "air_pressure_at_mean_sea_level", - "units": "Pa", - "ndim": 3 - }, - // radiative fluxes: - // "rsus": { - // "standard_name": "surface_upwelling_shortwave_flux_in_air", - // "units": "W m-2", - // "ndim": 3 - // }, - // "rsds": { - // "standard_name": "surface_downwelling_shortwave_flux_in_air", - // "units": "W m-2", - // "ndim": 3 - // }, - // "rsdt": { - // "standard_name": "toa_incoming_shortwave_flux", - // "units": "W m-2", - // "ndim": 3 - // }, - // "rsut": { - // "standard_name": "toa_outgoing_shortwave_flux", - // "units": "W m-2", - // "ndim": 3 - // }, - "FLUS": { - // correct name? Guessed according to pattern -- no FLUS, only the net combination? - "standard_name": "surface_upwelling_longwave_flux_in_air", - "units": "W m-2", - "ndim": 3 - }, - "FLDS": { - "standard_name": "surface_downwelling_longwave_flux_in_air", - "units": "W m-2", - "ndim": 3 - }, - "FLUT": { - "standard_name": "toa_outgoing_longwave_flux", - "units": "W m-2", - "ndim": 3 - }, - "FLNT": { - "standard_name": "net_upward_longwave_flux", - "units": "W m-2", - "ndim": 3 - }, - "SHFLX": { - "standard_name": "surface_upward_sensible_heat_flux", - "units": "W m-2", - "ndim": 3 - }, - "LHFLX": { - "standard_name": "surface_upward_latent_heat_flux", - "units": "W m-2", - "ndim": 3 - }, - "zos": { - "standard_name": "sea_surface_height_above_geoid", - "units": "m", - "ndim": 3 - }, - "tauuo": { - "standard_name": "surface_downward_x_stress", - "units": "N m-2", - "ndim": 3 - }, - "tauvo": { - "standard_name": "surface_downward_y_stress", - "units": "N m-2", - "ndim": 3 - }, - "areacello": { - "standard_name": "cell_area", - "modifier": "ocean_realm", - "units": "m2", - "ndim": 2 - }, - // Variables for AMOC_3D_Structure module: - // "uo": { - // "standard_name": "sea_water_x_velocity", - // "units": "m s-1" - // }, - // "vo": { - // "standard_name": "sea_water_y_velocity", - // "units": "m s-1" - // }, - // "so": { - // "standard_name": "sea_water_salinity", - // "units": "psu" - // }, - // "umo": { - // "standard_name": "ocean_mass_x_transport", - // "units": "kg s-1" - // }, - // "vmo": { - // "standard_name": "ocean_mass_y_transport", - // "units": "kg s-1" - // }, - "THETAL": { - "standard_name": "sea_water_potential_temperature", - "units": "K", - "ndim": 4 - }, - "SST": { - "standard_name": "Potential Temperature", - "units": "degC", - "ndim": 4 - }, - "SALT": { - "standard_name": "Salinity", - "units": "psu", - "ndim": 4 - }, - "SHF": { - "standard_name": "Surface Heat Flux", - "units": "W/m2", - "ndim": 4 - }, - // Variables for Convective Transition Diagnostics module: - // ta: 3D temperature, units = K: - "T": { - "standard_name": "air_temperature", - "units": "K", - "ndim": 4 - }, - // prw: Column Water Vapor (precipitable water vapor), units = mm (or kg/m^2) - "prw": { - // check name: is this column integrated? - "standard_name": "atmosphere_mass_content_of_water_vapor", - "units": "kg m-2", - "ndim": 3 - } - // "standard_name": "mass_content_of_water_in_soil_layer", - // "units": "kg m-2", - // "ndim": 3 - // }, - // "evspsbl": { - // "standard_name": "water_evapotranspiration_flux", - // "units": "kg m-2 s-1", - // "ndim": 3 - // } - }, - "env_vars" : { - // 0 for CMIP/GFDL date index start, 1 for CESM native date index start - "date_int_offset" : 1 - } -} From cb9bb5b23e1686188b3d3909b373b945a6168dd2 Mon Sep 17 00:00:00 2001 From: Taydra Low Date: Wed, 25 Oct 2023 11:52:10 -0600 Subject: [PATCH 3/3] will get rid of the hard coding of TLAT/TLONG --- diagnostics/natl_ocean/natl_ocean.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/diagnostics/natl_ocean/natl_ocean.py b/diagnostics/natl_ocean/natl_ocean.py index 83649613f..24e6db59d 100644 --- a/diagnostics/natl_ocean/natl_ocean.py +++ b/diagnostics/natl_ocean/natl_ocean.py @@ -128,6 +128,8 @@ # named "time": time_coord_name = os.environ["time_coord"] depth_coord_name = os.environ["z_t_coord"] +lat_coord_name = os.environ["TLAT_coord"] +lon_coord_name = os.environ["TLONG_coord"] # Set variable arrays sst_data = sst_dataset[sst_var_name] @@ -153,9 +155,9 @@ wmt_ds['wet'] = xr.where(~np.isnan(wmt_ds.tos),1,0) wmt_ds['sfdsi'] = xr.zeros_like(wmt_ds['hfds']).rename('sfdsi') wmt_ds['areacello'] = tarea_data/100e2 -wmt_ds = wmt_ds.drop({'ULAT','ULONG'}) -wmt_ds = wmt_ds.rename({'nlat': 'y', 'nlon':'x', 'TLAT':'lat', 'TLONG':'lon'}) - +#wmt_ds = wmt_ds.drop({'ULAT','ULONG'}) +wmt_ds = wmt_ds.rename({'nlat': 'y', 'nlon':'x', lat_coord_name:'lat', lon_coord_name:'lon'}) +#wmt_ds = wmt_ds.rename({lat_coord_name:'lat', lon_coord_name:'lon'}) #2)Calculate WMT model_mean_wmt = wmt_calc(wmt_ds)