<div dir="ltr"><div class="gmail-cell gmail-border-box-sizing gmail-text_cell gmail-rendered" style="margin:0px;padding:0px;box-sizing:border-box;border:1px solid transparent;display:flex;width:928px;outline:none"><div class="gmail-inner_cell" style="margin:0px;padding:0px;display:flex"><div class="gmail-text_cell_render gmail-border-box-sizing gmail-rendered_html" style="margin:0px;padding:0.5em 0.5em 0.5em 0.4em;box-sizing:border-box;outline:none;width:inherit;border-style:none"><h3 style="margin:1.55em 0px 0px;padding:0px;line-height:1"><font color="#000000" face="Helvetica Neue, Helvetica, Arial, sans-serif"><span style="font-size:14px;font-weight:400">Dear MITgcm Colleagues,</span></font></h3><div><font color="#000000" face="Helvetica Neue, Helvetica, Arial, sans-serif"><span style="font-size:14px;font-weight:400"><br></span></font></div><div><font color="#000000" face="Helvetica Neue, Helvetica, Arial, sans-serif"><span style="font-size:14px;font-weight:400">Below is a long meditation on the status of netCDF within the MITgcm ecosystem. I welcome your feedback and thoughts on this topic.</span></font></div><h3 style="margin:1.55em 0px 0px;padding:0px;line-height:1"><span style="color:inherit;font-family:inherit;font-size:18.004px">Preamble<br></span><span style="font-weight:normal"><br>First, let me acknowledge and thank everyone who is working to distribute model data in a user-friendly format. This is important and noble work, usually done without much incentive in terms of recognition or publications. My intent here is not to criticize any of this selfless effort. My goal is to ensure that, going forward, the data we distribute has the highest possible value to the community.</span></h3><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">My interest in this topic evolved from my goal to build useful tools for post-processing analysis of gcm output. The python package <a href="https://render.githubusercontent.com/view/xarray.pydata.org/en/latest/" style="margin:0px;padding:0px;color:rgb(0,136,204)">Xarray</a> is increasingly being adopted for this purpose, due to its ease of use, powerful set of computational methods, ability to read all common data formats, and scalability to distributed systems. (We now have an NSF award to support development of these tools--the name of this project is <a href="https://pangeo-data.github.io/" style="margin:0px;padding:0px;color:rgb(0,136,204)">Pangeo</a>.) I in particular have been working on a tool called <a href="http://xgcm.readthedocs.io/en/latest/" style="margin:0px;padding:0px;color:rgb(0,136,204)">xgcm</a>, which is designed to intelligently handle operations on finite-volume grids, providing grid-aware operations such as difference, interpolation, and cumsum. Xgcm consumes and produces xarray DataArrays. Because the goal of xgcm is to work with <em style="margin:0px;padding:0px">any</em> model output, I have become acutely aware of the differences between different data formats. Some choices made when producing data products can make it very easy for xarray and xgcm to process the data. Other choices can make it very hard.</p><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">There are two set of metadata conventions which are relevant to this discussion</p><ul style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 2em 0px;padding:0px;list-style-position:initial"><li style="margin:0px;padding:0px;line-height:20px"><a href="http://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/cf-conventions.html" style="margin:0px;padding:0px;color:rgb(0,136,204)">CF Conventions</a>, which apply to nearly all climate data</li><li style="margin:0px;padding:0px;line-height:20px"><a href="http://pycomodo.forge.imag.fr/norm.html" style="margin:0px;padding:0px;color:rgb(0,136,204)">Comodo conventions</a>, a less well-known but highly useful standard developed by the french NEMO group</li></ul><h3 style="color:inherit;font-family:inherit;font-size:18.004px;margin:1.55em 0px 0px;padding:0px;line-height:1">Problem Statement<a class="gmail-anchor-link" href="https://render.githubusercontent.com/view/ipynb?commit=9e5c9953abc3161e504012215e3e2bc21ccc746c&enc_url=68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f676973742f72616265726e61742f62663463383836633035353561613961366537383230643933393864396262662f7261772f396535633939353361626333313631653530343031323231356533653262633231636363373436632f6d697467636d5f6e65746364665f636f6d70617269736f6e2e6970796e62&nwo=rabernat%2Fbf4c886c0555aa9a6e7820d9398d9bbf&path=mitgcm_netcdf_comparison.ipynb&repository_id=85725145&repository_type=Gist#Problem-Statement" style="margin:0px;padding:0px 20px;color:rgb(0,136,204);text-decoration-line:none"></a></h3><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">There is a proliferation of different flavors of netCDF files generated from MITgcm simulations. Here is a partial list, based on what I am aware of</p><ul style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 2em 0px;padding:0px;list-style-position:initial"><li style="margin:0px;padding:0px;line-height:20px">The native <a href="http://mitgcm.org/public/r2_manual/latest/online_documents/node272.html" style="margin:0px;padding:0px;color:rgb(0,136,204)">MNC package</a> netCDF output</li><li style="margin:0px;padding:0px;line-height:20px">MITgcm MDS files as read by <a href="http://xmitgcm.readthedocs.io/en/latest/" style="margin:0px;padding:0px;color:rgb(0,136,204)">xmitgcm</a>, which turns them into xarray DataSets, essentially equivalent to netCDF (xmitgcm can read data with or without ancillary grid variables)</li><li style="margin:0px;padding:0px;line-height:20px">The <a style="margin:0px;padding:0px;color:rgb(0,136,204)">ECCOv4 products</a> which were distributed using a custom netCDF format produced offline</li><li style="margin:0px;padding:0px;line-height:20px">New <a href="http://sose.ucsd.edu/bsose_solution_Iter105.html" style="margin:0px;padding:0px;color:rgb(0,136,204)">SOSE products</a></li><li style="margin:0px;padding:0px;line-height:20px">Jody Klymak's new <a href="https://github.com/altMITgcm/MITgcm/pull/16" style="margin:0px;padding:0px;color:rgb(0,136,204)">NF90</a> package with parallel-netcdf support</li></ul><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">Not all of these flavors are optimally compatible with xarray and xgcm. I took the time to load the variables <code style="margin:0px;padding:0px;border-radius:3px;border:0px;white-space:pre-wrap">U</code>, <code style="margin:0px;padding:0px;border-radius:3px;border:0px;white-space:pre-wrap">V</code>, <code style="margin:0px;padding:0px;border-radius:3px;border:0px;white-space:pre-wrap">W</code>, <code style="margin:0px;padding:0px;border-radius:3px;border:0px;white-space:pre-wrap">Theta</code>, and <code style="margin:0px;padding:0px;border-radius:3px;border:0px;white-space:pre-wrap">Eta </code>in all of these different formats to examine the conventions used for the dimension names. This is summarized in the table below:</p><table style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em auto 0px;padding:0px;max-width:100%;background-color:transparent;border-collapse:collapse;border:1px solid rgb(0,0,0)"><thead style="margin:0px;padding:0px"><tr style="margin:1em 2em;padding:0px;border:1px solid rgb(0,0,0);border-collapse:collapse"><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle"></th><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle">mnc package</th><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle">xmitgcm</th><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle">xmitgcm (no grid)</th><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle">ECCOv4</th><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle">SOSE</th><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle">nf90io</th></tr></thead><tbody style="margin:0px;padding:0px"><tr style="margin:1em 2em;padding:0px;border:1px solid rgb(0,0,0);border-collapse:collapse"><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">U</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">U(T, Z, Y, Xp1)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">U(time, Z, YC, XG)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">U(time, k, j, i_g)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">UVELMASS(i1, i2, i3, i4)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">Uvel(iTIME, iDEPTH, iLAT, iLON)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">UVEL(record, k, j, i_g)</td></tr><tr style="margin:1em 2em;padding:0px;border:1px solid rgb(0,0,0);border-collapse:collapse"><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">V</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">V(T, Z, Yp1, X)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">V(time, Z, YG, XC)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">V(time, k, j_g, i)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">VVELMASS(i1, i2, i3, i4)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">Vvel(iTIME, iDEPTH, iLAT, iLON)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">VVEL(record, k, j_g, i)</td></tr><tr style="margin:1em 2em;padding:0px;border:1px solid rgb(0,0,0);border-collapse:collapse"><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">W</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">W(T, Zl, Y, X)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">W(time, Zl, YC, XC)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">W(time, k_l, j, i)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">WVELMASS(i1, i2, i3, i4)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">Wvel(iTIME, iDEPTH, iLAT, iLON)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">WVEL(record, k_l, j, i)</td></tr><tr style="margin:1em 2em;padding:0px;border:1px solid rgb(0,0,0);border-collapse:collapse"><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">Temp</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">Temp(T, Z, Y, X)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">T(time, Z, YC, XC)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">T(time, k, j, i)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">THETA(i1, i2, i3, i4)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">Theta(iTIME, iDEPTH, iLAT, iLON)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle"></td></tr><tr style="margin:1em 2em;padding:0px;border:1px solid rgb(0,0,0);border-collapse:collapse"><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">Eta</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">Eta(T, Y, X)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">Eta(time, YC, XC)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">Eta(time, j, i)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">ETAN(i1, i2, i3)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">SSH(iTIME, iLAT, iLON)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">ETAN(record, j, i)</td></tr></tbody></table><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">In terms of processing with xarray and xgcm, there are a couple of important things to note:</p><ol style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 2em 0px;padding:0px;list-style-position:initial"><li style="margin:0px;padding:0px;line-height:20px">Some flavors use unique dimensions for different points relative to the model grid (e.g., in mnc output, <code style="margin:0px;padding:0px;border-radius:3px;border:0px;white-space:pre-wrap">Z</code> for variables at the cell vertical center, <code style="margin:0px;padding:0px;border-radius:3px;border:0px;white-space:pre-wrap">Zl</code> for variables at the cell vertical face), while others don't make this distinction</li><li style="margin:0px;padding:0px;line-height:20px">Some flavors keep the dimension names consistent across different files, while others use the same dimension name to indicate very different things in different files. For example, in ECCOv2, <code style="margin:0px;padding:0px;border-radius:3px;border:0px;white-space:pre-wrap">i2</code> is the vertical dimension for <code style="margin:0px;padding:0px;border-radius:3px;border:0px;white-space:pre-wrap">THETA</code> but <code style="margin:0px;padding:0px;border-radius:3px;border:0px;white-space:pre-wrap">i2</code> is a horizontal dimension for <code style="margin:0px;padding:0px;border-radius:3px;border:0px;white-space:pre-wrap">ETAN</code>.</li></ol><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">Both of these issues can cause complications for downstream packages that wish to analyze the data. For example, if files use conflicting names to refer to the same dimension (issue 2), they can't easily be merged into a single xarray dataset. Or, on the flip side, if two variables that are actually at different spatial locations (e.g. <code style="margin:0px;padding:0px;border-radius:3px;border:0px;white-space:pre-wrap">UVEL</code> and <code style="margin:0px;padding:0px;border-radius:3px;border:0px;white-space:pre-wrap">VVEL</code>) have the same dimensions (e.g. in SOSE), this gives the mistaken impression that they can be multiplied or added directly. (In reality they need to be interpolated from one position for the next (that's what xgcm is for.)</p><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">Below I summarize the status of these issues in the different flavors:</p><table style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em auto 0px;padding:0px;max-width:100%;background-color:transparent;border-collapse:collapse;border:1px solid rgb(0,0,0)"><thead style="margin:0px;padding:0px"><tr style="margin:1em 2em;padding:0px;border:1px solid rgb(0,0,0);border-collapse:collapse"><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle"></th><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle">mnc package</th><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle">xmitgcm</th><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle">xmitgcm (no grid)</th><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle">ECCOv4</th><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle">SOSE</th><th style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;text-align:left;vertical-align:middle">nf90io</th></tr></thead><tbody style="margin:0px;padding:0px"><tr style="margin:1em 2em;padding:0px;border:1px solid rgb(0,0,0);border-collapse:collapse"><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">dimension order (time, depth, lat, lon)</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td></tr><tr style="margin:1em 2em;padding:0px;border:1px solid rgb(0,0,0);border-collapse:collapse"><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">consistent dimension names across files</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">❌</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td></tr><tr style="margin:1em 2em;padding:0px;border:1px solid rgb(0,0,0);border-collapse:collapse"><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">unique dimension name for different cell positions</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">❌</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">❌</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td></tr><tr style="margin:1em 2em;padding:0px;border:1px solid rgb(0,0,0);border-collapse:collapse"><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">comodo attributes in metadata</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">❌</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">❌</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">❌</td><td style="margin:1em 2em;padding:4px;border:1px solid rgb(0,0,0);border-collapse:collapse;vertical-align:middle">✅</td></tr></tbody></table><h3 style="color:inherit;font-family:inherit;font-size:18.004px;margin:1.55em 0px 0px;padding:0px;line-height:1">Where to go from here?<a class="gmail-anchor-link" href="https://render.githubusercontent.com/view/ipynb?commit=9e5c9953abc3161e504012215e3e2bc21ccc746c&enc_url=68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f676973742f72616265726e61742f62663463383836633035353561613961366537383230643933393864396262662f7261772f396535633939353361626333313631653530343031323231356533653262633231636363373436632f6d697467636d5f6e65746364665f636f6d70617269736f6e2e6970796e62&nwo=rabernat%2Fbf4c886c0555aa9a6e7820d9398d9bbf&path=mitgcm_netcdf_comparison.ipynb&repository_id=85725145&repository_type=Gist#Where-to-go-from-here?" style="margin:0px;padding:0px 20px;color:rgb(0,136,204);text-decoration-line:none"></a></h3><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">Going forward, I think it is important for the MITgcm community to standardize the netCDF files we are putting out in the world. Proliferating these different formats places an extra burden on users to write specialized postprocessing code, making our products harder to use. Products that are easy to use will be adopted more widely.</p><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">There are two basic scenarios that I hope we can support:</p><ol style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 2em 0px;padding:0px;list-style-position:initial"><li style="margin:0px;padding:0px;line-height:20px">Outputting netCDF online</li><li style="margin:0px;padding:0px;line-height:20px">Generating netCDF offline (from MDS output)</li></ol><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">Ideally, the thing the end user sees will look the same regardless of how it was produced.</p><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">I am very optimistic about Jody's nf90io package. The reason why netCDF is not widely used now as an output format is that the MNC package doesn't work in singleCpuIO mode. (Yes there are scripts to glue them together, but they are hard to use and don't scale well to very large simulations.) Ideally, in the future we will move away from MDS and toward generating netCDF online.</p><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">However, 2. (Generating netCDF offline from MDS output) will likely remain a necessity for quite a while. We should have a uniform way of doing this...</p><h3 style="color:inherit;font-family:inherit;font-size:18.004px;margin:1.55em 0px 0px;padding:0px;line-height:1">xmitgcm to the rescue?<a class="gmail-anchor-link" href="https://render.githubusercontent.com/view/ipynb?commit=9e5c9953abc3161e504012215e3e2bc21ccc746c&enc_url=68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f676973742f72616265726e61742f62663463383836633035353561613961366537383230643933393864396262662f7261772f396535633939353361626333313631653530343031323231356533653262633231636363373436632f6d697467636d5f6e65746364665f636f6d70617269736f6e2e6970796e62&nwo=rabernat%2Fbf4c886c0555aa9a6e7820d9398d9bbf&path=mitgcm_netcdf_comparison.ipynb&repository_id=85725145&repository_type=Gist#xmitgcm-to-the-rescue?" style="margin:0px;padding:0px 20px;color:rgb(0,136,204);text-decoration-line:none"></a></h3><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">Now comes the very opinionated part. I believe that we already have a universal tool for generating netCDF from MDS output. It is the <a href="http://xmitgcm.readthedocs.io/en/latest/" style="margin:0px;padding:0px;color:rgb(0,136,204)">xmitgcm python package</a>. This package can read MITgcm MDS data into xarray data structures and then write it to netcdf. The amount of code required to do this is about two lines, so expertise in python is not required. It produces netCDF files that are (in my subjective opinion), ideally formatted for postprocessing. Also, it looks like Jody adopted many of the conventions from xmitgcm for the nf90io package, meaning that netCDF files generated through these two different paths will look very similar.</p><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">xmitgcm is a work in progress. The choices made in terms of variable names and dimensions were intended to mimic the MNC package as much as possible. But ultimately I made some changes that I thought would result in more useful and readable data. For those of you who are interested in producing netCDF files from MDS output, <strong style="margin:0px;padding:0px">I welcome you to try out xmitgcm and see if it suits your needs!</strong> If you have ideas for how it can be improved, we encourage you to engage with us on the <a href="https://github.com/xgcm/xmitgcm/issues" style="margin:0px;padding:0px;color:rgb(0,136,204)">github issues page</a>.</p><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">If you managed to get this far, you must really care about netCDF! I welcome you thoughts and feedback.</p><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">Cheers,<br>Ryan</p><p style="color:rgb(0,0,0);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:1em 0px 0px;padding:0px;text-align:justify">p.s. This comparison, and the code that goes with it, can be found as an ipython notebook here:<br><a href="https://gist.github.com/rabernat/bf4c886c0555aa9a6e7820d9398d9bbf">https://gist.github.com/rabernat/bf4c886c0555aa9a6e7820d9398d9bbf</a></p><p style="margin:1em 0px 0px;padding:0px;text-align:justify"><font color="#000000" face="Helvetica Neue, Helvetica, Arial, sans-serif"><span style="font-size:14px"><br></span></font></p></div></div></div></div>