E3SM-Project / Omega

Next generation ocean model within E3SM
https://docs.e3sm.org/Omega/omega
Other
4 stars 5 forks source link

Adds a CF-compliant time dimension for Omega IO #169

Open philipwjones opened 1 week ago

philipwjones commented 1 week ago

Adds a CF-compliant unlimited time dimension

  - adds support for an unlimited time dimension
  - adds the CF-compliant time field with appropriate units
  - adds additional Field properties to support time-dependent fields
  - extends the support for non-distributed field IO into IOStream
  - updates documentation

This still only supports one time slice per file. A subsequent modification will add support for multiple slices in a file.

No additional unit tests were added, but I have manually confirmed the fields and dimensions appear correctly in the output files. Additional tests will be added as part of the upcoming multi-slice capability.

Checklist

xylar commented 1 day ago

I'm sorry for the delay in reviewing this. I wanted to test in Polaris, but needed to get https://github.com/E3SM-Project/polaris/pull/231 updated based on recent changed to Omega's develop branch before I could test this out. That is finally done and I'm testing this.

xylar commented 1 day ago

Beautiful!!

I'm seeing:

$ ncdump -v time output.nc 
netcdf output {
dimensions:
    MaxCellsOnEdge = 2 ;
    MaxEdges = 6 ;
    NCells = 2500 ;
    NEdges = 7500 ;
    NTracers = 5 ;
    NVertLevels = 1 ;
    NVertices = 5000 ;
    VertexDegree = 3 ;
    time = UNLIMITED ; // (1 currently)
variables:
...
    double time(time) ;
        time:Description = "time" ;
        time:FillValue = 0. ;
        time:Name = "time" ;
        time:StdName = "time" ;
        time:Units = "seconds since 0001-01-01 00:00:00" ;
        time:ValidMax = 1.e+20 ;
        time:ValidMin = 0. ;
        time:_FillValue = 0. ;
        time:calendar = "noleap" ;
        time:long_name = "time" ;
        time:name = "time" ;
        time:standard_name = "time" ;
        time:units = "seconds since 0001-01-01 00:00:00" ;
        time:valid_max = 1.e+20 ;
        time:valid_min = 0. ;

// global attributes:
        :SimulationTime = "0001-01-01_10:00:00" ;
data:

 time = 36000 ;
}

This is correct: we wanted to write out data 10 hours = 36000 seconds into the simulation.

@philipwjones, my only suggestion would be that 0. is not a safe FillValue and _FillValue. This should be something like -9.99e+30 used for LayerThickness.

I the meantime, I'll be working on making the manufactured solution analysis step in Polaris work with this update.