Reading-eScience-Centre / edal-java

Environmental Data Abstraction Layer libraries
Other
39 stars 30 forks source link

Performance tuning #115

Open docgregt opened 5 years ago

docgregt commented 5 years ago

I am not sure where to ask this question. I searched quite a while for info, but could not find any. Rendering arrows or barbs can take a few seconds on my 4 core 16GB RAM VM. I only have 10 datasets loaded and they are at .75x.75 degree resolution. What kind of hardware will speed it up? Or is there some Java setting to speed it up? What affects the performance the most?

Greg

guygriffiths commented 5 years ago

Hard to say. Arrows/barbs need to read twice as much data as single variable fields (the components are calculated on-the-fly), so they will always be slower than average rendering. Generally speaking, the biggest bottleneck is reading the data from disk. How is your data available within your VM?

docgregt commented 5 years ago

Hard disk. But IO is measured via IOPS. So I will try increasing IOPS.

docgregt commented 5 years ago

I doubled everything (cpu/ram, iops) and only got marginal speedup. There must be some caching to improve things. I set caching at 4GB. Note that our clients do not like tiling so I am using the single image capability of OpenLayers. It all works great but I would like to speed it up.

So fyi if mag/dir are precomputed and then just used in a group and the arrow/barb is just rotated by SLD then it would be much faster. You said this was a future idea. How far out in the future is it? I still have the problem of drawing current arrows.

guygriffiths commented 5 years ago

Yes, single images will almost always have worse performance than tiles, because of the way the cache works (we cache the data read on each request). If a different area is requested each time, as is the case with single images, the cache rarely gets used.

If you precompute mag/dir (in the NetCDF files), it will speed things up (once I implement that), but if you are plotting both magnitude and direction, then both fields will still need to be read, so you won't see much of an improvement. If you are only plotting direction then in theory it should be slightly over twice as quick to render.

I don't currently have a great deal of time to work on ncWMS, but if you'd be happy using a development build, I could add automatic grouping of magnitude and direction pretty quickly. If you have an example data file containing a magnitude and direction fields for a single variable, that would be very helpful.

docgregt commented 5 years ago

I would be glad to be your tester. I have lots of files with mag,dir as that is how 'Mean wave direction' (mwd) and 'Significant height of combined wind waves and swell' (swh) come. Here is a link with one of my files: https://i4insightcom-my.sharepoint.com/:u:/g/personal/greg_turner_i4-insight_com/EfbvpndHUz1PkqKP-f6Jk6MBzFzFNqPBCP32sFABcuv7BA?e=ixuC77

guygriffiths commented 5 years ago

OK, that's an interesting one. It's obviously sensible to plot wave height and direction together, but I don't think they're fundamentally related in the same way that speed and direction are.

I've got a solution in mind which could work, but it will need some finessing. Let me see what I can do for a quick fix and you could test it to see whether it solves your issue.

docgregt commented 5 years ago

Were you able to download the file and see the data?

guygriffiths commented 5 years ago

Yes, thanks. I managed to get them grouped manually, and behaving properly, but there are some complications trying to pick up the grouping automatically. Unfortunately I now have a couple of deadlines coming up so won't be able to work on it for a week or two.

docgregt commented 5 years ago

Very cool. I am wondering how hard is it for there to be a menu on the ingestion side to allow the end user to select properties to be grouped rather than having the code detect it automatically. Or it is simple enough to add a new metadata field to the netcdf file called GroupWith and then some name as the value. Since this is a quick fix the second approach might be easiest for you. And thanks for your time. I certainly understand deadlines.

guygriffiths commented 5 years ago

The approach I was considering was a way to define a style such that if a dataset could create a new grouping to support it, it would. However, your GroupWith approach could be a good one. We did something similar a few years back with NetCDF-U, which was a way of defining relations between quantities and their uncertainties. I'll look into it when I get a little more time.

docgregt commented 5 years ago

Hi, I am ready to test it when you get a chance to gen something. I now have two different data sets with the same issue. My new data is ocean current data that has a direction and magnitude.

guygriffiths commented 5 years ago

Apologies, I don't have much time to work on ncWMS at the moment. I did manage to grab a couple of hours this afternoon to try something. You can download the development version from http://www.personal.rdg.ac.uk/~qx901922/ncWMS2.war

Basically to get it to work, you need a few different attributes on your variables. You will need the logical_group attribute on all variables you want to be part of a group. The value of this should be the group name they will be collected under - this is what will appear in the menu. You also need to make sure that every variable has a standard_name attribute (I'm pretty sure that if it's missing, you can use the long_name attribute instead, but spaces may cause issues and I haven't tested it).

Once that's up-and-running, you should find that your variables appear in groups in the menu, and you can plot them as usual, but clicking the parent variable will do nothing. I'd recommend you get to this stage before moving on.

Next, you need a custom style. If you create swell_dir.xml in ~/.ncWMS2/.styles/, with the following contents:

<?xml version="1.0" encoding="ISO-8859-1"?>
<StyledLayerDescriptor version="1.1.0" xsi:schemaLocation="http://www.opengis.net/sld
StyledLayerDescriptor.xsd" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc"
xmlns:se="http://www.opengis.net/se" xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:resc="http://www.resc.reading.ac.uk">
  <NamedLayer>
    <se:Name>$layerName-swell</se:Name>
    <UserStyle>
      <se:CoverageStyle>
        <se:Rule>
          <se:RasterSymbolizer>
            <se:Opacity>$opacity</se:Opacity>
            <se:ColorMap>
              <resc:Segment fallbackValue="$bgColor">
                <se:LookupValue>Rasterdata</se:LookupValue>
                <resc:BelowMinValue>$belowMinColor</resc:BelowMinValue>
                <resc:ValueList>
                  <se:Name>$paletteName</se:Name>
                </resc:ValueList>
                <resc:AboveMaxValue>$aboveMaxColor</resc:AboveMaxValue>
                <resc:Range>
                  <resc:Minimum>$scaleMin</resc:Minimum>
                  <resc:Maximum>$scaleMax</resc:Maximum>
                  <resc:Spacing>$logarithmic</resc:Spacing>
                </resc:Range>
                <resc:NumberOfSegments>$numColorBands</resc:NumberOfSegments>
              </resc:Segment>
            </se:ColorMap>
          </se:RasterSymbolizer>
        </se:Rule>
      </se:CoverageStyle>
    </UserStyle>
  </NamedLayer>
  <NamedLayer>
    <se:Name>$layerName-direction</se:Name>
    <UserStyle>
      <se:CoverageStyle>
        <se:Rule>
          <resc:ArrowSymbolizer>
            <se:Opacity>$opacity</se:Opacity>
            <resc:ArrowSize>8</resc:ArrowSize>
            <resc:ArrowColour>#FF000000</resc:ArrowColour>
            <resc:ArrowStyle>THIN_ARROW</resc:ArrowStyle>
          </resc:ArrowSymbolizer>
        </se:Rule>
      </se:CoverageStyle>
    </UserStyle>
  </NamedLayer>
</StyledLayerDescriptor>

then ncWMS should look for groups containing children with the standard_names of swell and direction (i.e. the endings to the $layerName- tags) . These should match the standard_name attribute values in the NetCDF, and should be something more suitable than swell and direction ;-)

Restart ncWMS and then the top-level group should be clickable and plot swell + direction as expected. This was all rather rushed, so just drop me a line if you get any issues. Assuming it all works, I'll tidy it up and some point and make it into a proper release

docgregt commented 5 years ago

@guygriffiths , Thank you for spending time on this. I am trying to test it out, but I seem to have broken something. Regardless of the ncWMS version I use and I get the following error: 2019-03-12 19:38:16 ERROR DatasetConfig:232 - uk.ac.rdg.resc.edal.exceptions.EdalException loading metadata for dataset test1 uk.ac.rdg.resc.edal.exceptions.EdalException: Problem creating dataset test1 at /data/geoserver/ecmwf/75/07WindWaveSwellSSTSP75.nc at uk.ac.rdg.resc.edal.dataset.cdm.CdmDatasetFactory.createDataset(CdmDatasetFactory.java:131) at uk.ac.rdg.resc.edal.dataset.cdm.CdmDatasetFactory.createDataset(CdmDatasetFactory.java:1) at uk.ac.rdg.resc.edal.catalogue.jaxb.DatasetConfig.createDataset(DatasetConfig.java:254) at uk.ac.rdg.resc.edal.catalogue.jaxb.DatasetConfig.refresh(DatasetConfig.java:213) at uk.ac.rdg.resc.edal.catalogue.jaxb.CatalogueConfig$1.run(CatalogueConfig.java:154) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.NoSuchMethodError: org.opengis.referencing.cs.CSFactory.createCoordinateSystemAxis(Ljava/util/Map;Ljava/lang/String;Lorg/opengis/referencing/cs/AxisDirection;Ljavax/measure/Unit;)Lorg/opengis/referencing/cs/CoordinateSystemAxis; ... I did not change data and using the standalone version which worked even today now gets this error and I do not know why. I started from scratch and still get the error. I only have 1 file I am trying to load for test purposes which worked fine earlier today. All of my files pass the CF checker: Using CF Checker Version 2.0.9 Checking against CF Version CF-1.6 ERRORS detected: 0 WARNINGS given: 0 INFORMATION messages: 0 Any ideas?

I solved this issue by rebooting the VM. Not sure what happened to it, but I suspect MS changed something.

docgregt commented 5 years ago

Hi @guygriffiths , I do not know why I can't run on the ubuntu server, but I am able to run on my windows desktop using the windows linux support that now exists. So i made the updates you suggested for logical_group and every variable had a standard_name. I loaded the file into ncWMS ok, but no group names were displayed. Here is an ncdump of the file: variables: double time(time) ; time:standard_name = "time" ; time:long_name = "Forecast time for ForecastModelRunCollection" ; time:units = "seconds since 1970-01-01T00:00:00Z" ; time:calendar = "proleptic_gregorian" ; time:axis = "T" ; double longitude(longitude) ; longitude:standard_name = "longitude" ; longitude:long_name = "Longitude" ; longitude:units = "degrees_east" ; longitude:axis = "X" ; double latitude(latitude) ; latitude:standard_name = "latitude" ; latitude:long_name = "Latitude" ; latitude:units = "degrees_north" ; latitude:axis = "Y" ; short mwd(time, latitude, longitude) ; mwd:standard_name = "sea_surface_wave_from_direction" ; mwd:long_name = "Mean wave direction from (Mdir)" ; mwd:units = "degree" ; mwd:add_offset = 180.f ; mwd:scale_factor = 0.01f ; mwd:_FillValue = -32767s ; mwd:missing_value = -32767s ; mwd:_CoordinateAxes = "time latitude longitude " ; mwd:cell_methods = "time:point area:mean" ; mwd:type_of_analysis = "spectral analysis" ; mwd:WMO_code = 200 ; mwd:_ChunkSizes = 1, 681, 1440 ; mwd:logical_group = "wave" ; double ssp(time, latitude, longitude) ; ssp:standard_name = "air_pressure_at_sea_level" ; ssp:long_name = "mean sea level pressure" ; ssp:units = "Pa" ; ssp:_FillValue = -999000000. ; ssp:missing_value = -999000000. ; ssp:_CoordinateAxisType = "Pressure" ; ssp:colorBarMaximum = 102500. ; ssp:colorBarMinimum = 62500. ; ssp:ioos_category = "Pressure" ; ssp:least_significant_digit = 3 ; short swh(time, latitude, longitude) ; swh:standard_name = "sea_surface_wave_significant_height" ; swh:long_name = "Spectral significant wave height (Hm0)" ; swh:units = "m" ; swh:add_offset = 0.f ; swh:scale_factor = 0.01f ; swh:_FillValue = -32767s ; swh:missing_value = -32767s ; swh:_CoordinateAxes = "time latitude longitude " ; swh:cell_methods = "time:point area:mean" ; swh:type_of_analysis = "spectral analysis" ; swh:WMO_code = 100 ; swh:_ChunkSizes = 1, 681, 1440 ; swh:logical_group = "wave" ; double winddir(time, latitude, longitude) ; winddir:standard_name = "eastward_wind" ; winddir:long_name = "eastward wind velocity at 10m" ; winddir:units = "degree" ; winddir:_FillValue = -999000000. ; winddir:missing_value = -999000000. ; winddir:colorBarMaximum = 20. ; winddir:colorBarMinimum = -20. ; winddir:ioos_category = "Wind" ; winddir:least_significant_digit = 3 ; winddir:logical_group = "wind" ; double windspd(time, latitude, longitude) ; windspd:standard_name = "eastward_wind" ; windspd:long_name = "eastward wind velocity at 10m" ; windspd:units = "m s-1" ; windspd:_FillValue = -999000000. ; windspd:missing_value = -999000000. ; windspd:colorBarMaximum = 20. ; windspd:colorBarMinimum = -20. ; windspd:ioos_category = "Wind" ; windspd:least_significant_digit = 3 ; windspd:logical_group = "wind" ; double currdir(time, latitude, longitude) ; currdir:standard_name = "eastward_sea_water_velocity" ; currdir:long_name = "Eastward velocity" ; currdir:units = "degree" ; currdir:_FillValue = -32767. ; currdir:missing_value = -32767. ; currdir:_CoordinateAxes = "time depth latitude longitude " ; currdir:cell_methods = "area: mean depth: mean" ; currdir:unit_long = "Meters per second" ; currdir:least_significant_digit = 3 ; currdir:logical_group = "current" ; double currspd(time, latitude, longitude) ; currspd:standard_name = "eastward_sea_water_velocity" ; currspd:long_name = "Eastward velocity" ; currspd:units = "m s-1" ; currspd:_FillValue = -32767. ; currspd:missing_value = -32767. ; currspd:_CoordinateAxes = "time depth latitude longitude " ; currspd:cell_methods = "area: mean depth: mean" ; currspd:unit_long = "Meters per second" ; currspd:least_significant_digit = 3 ; currspd:logical_group = "current" ; float sst(time, latitude, longitude) ; sst:standard_name = "sea_water_potential_temperature" ; sst:long_name = "Temperature" ; sst:units = "degrees_C" ; sst:_FillValue = -32767.f ; sst:missing_value = -32767.f ; sst:_CoordinateAxes = "time depth latitude longitude " ; sst:unit_long = "Degrees Celsius" ; sst:cell_methods = "area: mean depth: mean" ;

I will also upload the file for your access at: https://i4insightcom-my.sharepoint.com/:f:/g/personal/greg_turner_i4-insight_com/EhuYWw9e9tFNqTFOzkH9M0sB5hYHI09zQVdoJ2tvjEhgaA

Sorry, it is a large file. Please let me know what I am doing wrong. Thanks for your time! Greg

guygriffiths commented 5 years ago

Sorry, I forgot to mention that you will need to remove and re-add the dataset - just modifying it won't make a difference.

docgregt commented 5 years ago

No Change. I removed it. Restarted ncwms and it still looks the same. Maybe I am running what you sent me wrong. I took standalone jar and removed the embedded war file and put the war file you sent in the jar. Then I run that one. Here is the menu: image The first 6 items should be 3 groups. Not sure what to do next. Did you try the file I uploaded?

guygriffiths commented 5 years ago

No, I tried to download it but the link had already expired. If you can make it available again I'll try running it on my version.

docgregt commented 5 years ago

https://i4insightcom-my.sharepoint.com/:u:/g/personal/greg_turner_i4-insight_com/EXs3RzAxsY5GnN7XHImaU4wBpyaou6cPj7_cIl58--5Dhg?e=yoBuM7

Gregory Turner Chief Architect


i4 Insight, Inc.

cell: +1.720.335.1744 greg.turner@i4-insight.commailto:greg.turner@i4-insight.com

A member of the Lloyd’s Register Group

From: Guy Griffiths notifications@github.com Sent: Thursday, March 14, 2019 3:35 AM To: Reading-eScience-Centre/edal-java edal-java@noreply.github.com Cc: Greg Turner greg.turner@i4-insight.com; Author author@noreply.github.com Subject: Re: [Reading-eScience-Centre/edal-java] Performance tuning (#115)

No, I tried to download it but the link had already expired. If you can make it available again I'll try running it on my version.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHubhttps://github.com/Reading-eScience-Centre/edal-java/issues/115#issuecomment-472773009, or mute the threadhttps://github.com/notifications/unsubscribe-auth/ApVpH2tObcgCxlJYOg3Gc_yGYvwCzKNTks5vWhffgaJpZM4aEmnl.

docgregt commented 5 years ago

@guygriffiths , Hi, I know you are busy, but I am running into another issue with the new version. I am unable to select any color palette other than the default one for temperature and 'mean sea level pressure'. Hopefully, I am doing something wrong that is simple. I get the following error when I choose another palette: [Winstone 2019/03/15 04:43:40] - Untrapped Error in Servlet java.lang.NoSuchMethodError: org.opengis.referencing.datum.Ellipsoid.getAxisUnit()Ljavax/measure/Unit; at org.apache.sis.referencing.datum.DefaultEllipsoid.castOrCopy(DefaultEllipsoid.java:340) at org.apache.sis.internal.referencing.WKTUtilities.toFormattable(WKTUtilities.java:154) at org.apache.sis.referencing.datum.DefaultGeodeticDatum.formatTo(DefaultGeodeticDatum.java:617) at org.apache.sis.io.wkt.Formatter.append(Formatter.java:664) at org.apache.sis.referencing.crs.DefaultGeodeticCRS.formatTo(DefaultGeodeticCRS.java:202) at org.apache.sis.referencing.crs.DefaultGeographicCRS.formatTo(DefaultGeographicCRS.java:318) at org.apache.sis.io.wkt.Formatter.append(Formatter.java:664) at org.apache.sis.io.wkt.FormattableObject.formatWKT(FormattableObject.java:199) at org.apache.sis.io.wkt.FormattableObject.toString(FormattableObject.java:126) at uk.ac.rdg.resc.edal.geometry.BoundingBoxImpl.equals(BoundingBoxImpl.java:251) at uk.ac.rdg.resc.edal.graphics.utils.PlottingDomainParams.equals(PlottingDomainParams.java:160) at uk.ac.rdg.resc.edal.catalogue.DataCatalogue$CacheKey.equals(DataCatalogue.java:533) at net.sf.ehcache.store.chm.SelectableConcurrentHashMap$Segment.get(SelectableConcurrentHashMap.java:726) at net.sf.ehcache.store.chm.SelectableConcurrentHashMap.get(SelectableConcurrentHashMap.java:324) at net.sf.ehcache.store.MemoryStore.get(MemoryStore.java:326) at net.sf.ehcache.Cache.get(Cache.java:1723) at net.sf.ehcache.Cache.get(Cache.java:1696) at uk.ac.rdg.resc.edal.catalogue.DataCatalogue.getFeaturesForLayer(DataCatalogue.java:468) at uk.ac.rdg.resc.edal.graphics.style.GriddedImageLayer$MapFeatureDataReader.extractFeature(GriddedImageLayer.java:86) at uk.ac.rdg.resc.edal.graphics.style.GriddedImageLayer$MapFeatureDataReader.getFeature(GriddedImageLayer.java:77) at uk.ac.rdg.resc.edal.graphics.style.GriddedImageLayer$MapFeatureDataReader.getDataForLayerName(GriddedImageLayer.java:131) at uk.ac.rdg.resc.edal.graphics.style.RasterLayer.drawIntoImage(RasterLayer.java:73) at uk.ac.rdg.resc.edal.graphics.style.GriddedImageLayer.drawIntoImage(GriddedImageLayer.java:180) at uk.ac.rdg.resc.edal.graphics.style.ImageLayer.drawImage(ImageLayer.java:51) at uk.ac.rdg.resc.edal.graphics.style.MapImage.drawImage(MapImage.java:69) at uk.ac.rdg.resc.edal.wms.WmsServlet.getMap(WmsServlet.java:536) at uk.ac.rdg.resc.edal.wms.WmsServlet.dispatchWmsRequest(WmsServlet.java:368) at uk.ac.rdg.resc.edal.ncwms.NcwmsServlet.dispatchWmsRequest(NcwmsServlet.java:212) at uk.ac.rdg.resc.edal.wms.WmsServlet.doGet(WmsServlet.java:303) at javax.servlet.http.HttpServlet.service(HttpServlet.java:104) at javax.servlet.http.HttpServlet.service(HttpServlet.java:45) at winstone.ServletConfiguration.execute(ServletConfiguration.java:249) at winstone.RequestDispatcher.forward(RequestDispatcher.java:335) at winstone.RequestDispatcher.doFilter(RequestDispatcher.java:378) at com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.java:168) at com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.java:233) at winstone.FilterConfiguration.execute(FilterConfiguration.java:195) at winstone.RequestDispatcher.doFilter(RequestDispatcher.java:368) at winstone.RequestDispatcher.forward(RequestDispatcher.java:333) at winstone.RequestHandlerThread.processRequest(RequestHandlerThread.java:244) at winstone.RequestHandlerThread.run(RequestHandlerThread.java:150) at java.lang.Thread.run(Thread.java:748)

You should see the issue in the file i sent you.

guygriffiths commented 5 years ago

@docgregt - The file you supplied doesn't work with grouping, because you have tried to group multiple variables together with the same standard name (currspd and currdir are both declared to be eastward_wind_velocity), but that is unrelated to the errors you are seeing.

I suspect that they are caused by the way that you have replaced the .war file in the standalone version of ncWMS (although I don't see an obvious reason why). I'd recommend using the previous .warfile in Tomcat, and if you want to run a standalone version, I have put the auto-generated one (which I have tested) here: http://www.personal.rdg.ac.uk/~qx901922/ncWMS2-standalone.jar

docgregt commented 5 years ago

@guygriffiths - I downloaded the latest jar and i fixed the .nc file and no success. The errors are still there and there still is no grouping. I uploaded the latest .nc file for your debugging.

https://i4insightcom-my.sharepoint.com/:u:/g/personal/greg_turner_i4-insight_com/EXRh-ND2IO9Ls3oi6j8vkIwB6RcPdPCxTU8yQXm-L3Hr2A?e=f19MKc

Here is dump of .nc file.

netcdf C:/Users/GregTurner/Desktop/data/weather/lloyds/final1/wd_201801.nc {
  dimensions:
    time = UNLIMITED;   // (248 currently)
    longitude = 720;
    latitude = 341;
  variables:
    float mwd(time=248, latitude=341, longitude=720);
      :standard_name = "sea_surface_wave_from_direction";
      :long_name = "Mean wave direction from (Mdir)";
      :units = "degree";
      :_CoordinateAxes = "time latitude longitude ";
      :cell_methods = "time:point area:mean";
      :type_of_analysis = "spectral analysis";
      :WMO_code = 200; // int
      :_ChunkSizes = 1, 681, 1440; // int
      :logical_group = "wave";

    float swh(time=248, latitude=341, longitude=720);
      :standard_name = "sea_surface_wave_significant_height";
      :long_name = "Spectral significant wave height (Hm0)";
      :units = "m";
      :_CoordinateAxes = "time latitude longitude ";
      :cell_methods = "time:point area:mean";
      :type_of_analysis = "spectral analysis";
      :WMO_code = 100; // int
      :_ChunkSizes = 1, 681, 1440; // int
      :logical_group = "wave";

    double winddir(time=248, latitude=341, longitude=720);
      :standard_name = "wind_to_direction";
      :long_name = "Eastward wind direction at 10m";
      :units = "degree";
      :_FillValue = -9.99E8; // double
      :missing_value = -9.99E8; // double
      :colorBarMaximum = 20.0; // double
      :colorBarMinimum = -20.0; // double
      :ioos_category = "Wind";
      :least_significant_digit = 3; // int
      :logical_group = "wind";

    double windspd(time=248, latitude=341, longitude=720);
      :standard_name = "wind_speed";
      :long_name = "Eastward wind speed at 10m";
      :units = "m s-1";
      :_FillValue = -9.99E8; // double
      :missing_value = -9.99E8; // double
      :colorBarMaximum = 20.0; // double
      :colorBarMinimum = -20.0; // double
      :ioos_category = "Wind";
      :least_significant_digit = 3; // int
      :logical_group = "wind";

    double currdir(time=248, latitude=341, longitude=720);
      :standard_name = "sea_water_to_direction";
      :long_name = "Eastward sea direction";
      :units = "degree";
      :_FillValue = -32767.0; // double
      :missing_value = -32767.0; // double
      :_CoordinateAxes = "time depth latitude longitude ";
      :cell_methods = "area: mean depth: mean";
      :unit_long = "Meters per second";
      :least_significant_digit = 3; // int
      :logical_group = "current";

    double currspd(time=248, latitude=341, longitude=720);
      :standard_name = "sea_water_speed";
      :long_name = "Eastward sea speed";
      :units = "m s-1";
      :_FillValue = -32767.0; // double
      :missing_value = -32767.0; // double
      :_CoordinateAxes = "time depth latitude longitude ";
      :cell_methods = "area: mean depth: mean";
      :unit_long = "Meters per second";
      :least_significant_digit = 3; // int
      :logical_group = "current";

    float sst(time=248, latitude=341, longitude=720);
      :standard_name = "sea_water_potential_temperature";
      :long_name = "Temperature";
      :units = "degrees_C";
      :_FillValue = -32767.0f; // float
      :missing_value = -32767.0f; // float
      :_CoordinateAxes = "time depth latitude longitude ";
      :unit_long = "Degrees Celsius";
      :cell_methods = "area: mean depth: mean";

    double time(time=248);
      :standard_name = "time";
      :long_name = "Forecast time for ForecastModelRunCollection";
      :units = "seconds since 1970-01-01T00:00:00Z";
      :calendar = "proleptic_gregorian";
      :axis = "T";
      :_CoordinateAxisType = "Time";

    double longitude(longitude=720);
      :standard_name = "longitude";
      :long_name = "Longitude";
      :units = "degrees_east";
      :axis = "X";
      :_CoordinateAxisType = "Lon";

    double latitude(latitude=341);
      :standard_name = "latitude";
      :long_name = "Latitude";
      :units = "degrees_north";
      :axis = "Y";
      :_CoordinateAxisType = "Lat";

    double ssp(time=248, latitude=341, longitude=720);
      :standard_name = "air_pressure_at_sea_level";
      :long_name = "mean sea level pressure";
      :units = "Pa";
      :_FillValue = -9.99E8; // double
      :missing_value = -9.99E8; // double
      :_CoordinateAxisType = "Pressure";
      :colorBarMaximum = 102500.0; // double
      :colorBarMinimum = 62500.0; // double
      :ioos_category = "Pressure";
      :least_significant_digit = 3; // int
docgregt commented 5 years ago

Hi Guy, I have tried everything I can think of to get it to work. I just don't know what to do. I really need your help with it.

Thanks, Greg