diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingHazardsReader.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingHazardsReader.java index 4953f9eeb796ab25afd1eb4161f51b791a2531d0..92088868cdc1a45e5f2cc14bb71364b77e92d44e 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingHazardsReader.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/BoundingHazardsReader.java @@ -31,7 +31,6 @@ public class BoundingHazardsReader { BoundingHazardsReader(NshmNetcdfReader netcdf, Location site) { this.netcdf = netcdf; this.coords = netcdf.coordinates(); - coords.contains(site); setBoundingHazards(site); } diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/NetcdfCoordinates.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/NetcdfCoordinates.java index 079d597712fcae71bf26e49af4f6cb64cdf1c0e2..3ca684e889792cbbc7d46cd4ca257d6ffbf369c2 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/NetcdfCoordinates.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/reader/NetcdfCoordinates.java @@ -1,8 +1,5 @@ package gov.usgs.earthquake.nshmp.netcdf.reader; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkState; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -16,15 +13,6 @@ import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import gov.usgs.earthquake.nshmp.Maths; -import gov.usgs.earthquake.nshmp.geo.BorderType; -import gov.usgs.earthquake.nshmp.geo.Location; -import gov.usgs.earthquake.nshmp.geo.LocationList; -import gov.usgs.earthquake.nshmp.geo.Region; -import gov.usgs.earthquake.nshmp.geo.Regions; -import gov.usgs.earthquake.nshmp.geo.json.Feature; -import gov.usgs.earthquake.nshmp.geo.json.FeatureCollection; -import gov.usgs.earthquake.nshmp.geo.json.GeoJson; -import gov.usgs.earthquake.nshmp.geo.json.Properties; import gov.usgs.earthquake.nshmp.gmm.Imt; import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass; import gov.usgs.earthquake.nshmp.netcdf.reader.NetcdfUtils.Key; @@ -45,7 +33,6 @@ public class NetcdfCoordinates { private final List<Imt> imts; private final Map<Imt, double[]> imls; private final int nIml; - private final Region region; private final double[] longitudes; private final double[] latitudes; @@ -116,42 +103,6 @@ public class NetcdfCoordinates { // TODO: Dynamic set location precision from NetCDF .map(lon -> Maths.round(lon, 3)) .toArray(); - - /* - * build region from GeoJSON string - follow logic in {@code - * Sites.createSiteRegion()}, which is private, without converting to - * GriddedRegion. {@code Sites.createSiteRegion()} requires that if an - * extents Feature (rectangular bounds) is present, it MUST be the first - * feature - * - * I think we just want the polygon border and don't need the gridded sites? - * Unless these could be used to more efficiently look up site index? - */ - // TODO: Error handling? how much, if any, error checking? Can we assume - // it's a valid GeoJSON file here if we make sure we only load valid files - // into the netCDF? - - // Read from netCDF - String bounds = vBounds.readScalarString(); - // Convert string to FeatureCollection - FeatureCollection dataRegions = GeoJson.from(bounds).toFeatureCollection(); - // Extract Features - List<Feature> features = dataRegions.features(); - - // From {@code Sites.createSiteRegion()} - checkState(features.size() <= 2, "Only 2 polygon features may be defined"); - int mapRegionIndex = 0; - if (features.size() > 1) { - // don't need to process the rectangular map extents, if present - mapRegionIndex = 1; - } - Feature sitesPoly = features.get(mapRegionIndex); - LocationList sitesPolyBorder = sitesPoly.asPolygonBorder(); - Properties properties = sitesPoly.properties(); - // get region name - either "title" or "name" property??? - String mapName = - properties.getString("title").orElse(properties.getString("name").orElse("Unnamed Map")); - region = Regions.create(mapName, sitesPolyBorder, BorderType.MERCATOR_LINEAR); } /** @@ -189,13 +140,6 @@ public class NetcdfCoordinates { return nIml; } - /** - * Returns the region - */ - public Region region() { - return Regions.copyOf(region); - } - /** * Return the site classes */ @@ -203,24 +147,6 @@ public class NetcdfCoordinates { return List.copyOf(siteClasses); } - /** - * Validate a target site is contained with in the bounds. - * - * @param site The site to test - */ - public void contains(Location site) { - checkArgument( - region.contains(site), - String.format("Target site [%s] is not contained within %s calculation region", - site.toString(), region.name())); - // No longer necessary? region is now the calculation polygon, rather than a - // rectangular boundary - var bounds = region.bounds(); - checkArgument( - region.contains(site), - String.format("Target site [%s] out of range %s", site.toString(), bounds.toString())); - } - /* * convert 2D Iml variable (dimensions Imt, Iml) to map of Imls by Imt * diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfController.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfController.java index 5a00fc8a2a557d07197e391ff8b2b36ec7f06eca..137bcc9bd2cbfa5b5c43cab993d0a6339b93c381 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfController.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfController.java @@ -151,25 +151,6 @@ public class NetcdfController { return doGetHazard(request, longitude, latitude, null, null); } - /** - * Returns the border as a GeoJSON feature collections. - * - * @param request The HTTP request - */ - @Operation( - summary = "Returns the border as a GeoJSON feature collection.", - description = "Returns a GeoJSON feature collections of the border defining the data.", - operationId = "netcdf_data_region_doGetBorder") - @ApiResponse( - description = "GeoJSON feature collection", - responseCode = "200", - content = @Content( - schema = @Schema(type = "string"))) - @Get(uri = "/border", produces = MediaType.APPLICATION_JSON) - public HttpResponse<String> doGetBorder(HttpRequest<?> request) { - return NetcdfService.handleDoGetBorder(request, path); - } - /** * GET method to return the bounding hazards using URL query. * diff --git a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfService.java b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfService.java index 4f229cd69d297ffe361c90a998ae27595b282a6b..cb42aa9a0801b8ec13d464a230bbeac30a9b8bc4 100644 --- a/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfService.java +++ b/src/main/java/gov/usgs/earthquake/nshmp/netcdf/www/NetcdfService.java @@ -8,10 +8,7 @@ import java.util.logging.Logger; import java.util.stream.Collectors; import gov.usgs.earthquake.nshmp.data.XySequence; -import gov.usgs.earthquake.nshmp.geo.Bounds; import gov.usgs.earthquake.nshmp.geo.Location; -import gov.usgs.earthquake.nshmp.geo.json.Feature; -import gov.usgs.earthquake.nshmp.geo.json.GeoJson; import gov.usgs.earthquake.nshmp.gmm.Imt; import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass; import gov.usgs.earthquake.nshmp.netcdf.NshmNetcdfReader; @@ -92,31 +89,6 @@ public class NetcdfService { } - static HttpResponse<String> handleDoGetBorder( - HttpRequest<?> request, - Path path) { - SERVICE_NAME = String.format(SERVICE_NAME); - try { - setNetcdf(path); - var geojson = GeoJson.builder(); - var border = netcdf.coordinates().region().border(); - - var id = 0; - for (var location : border) { - var feature = Feature.point(location) - .id(id++) - .build(); - - geojson.add(feature); - } - - return HttpResponse.ok(geojson.build().toJson()); - } catch (Exception e) { - var url = request.getUri().toString(); - return NetcdfWsUtils.handleError(e, SERVICE_NAME, url); - } - } - static HttpResponse<String> metadata(HttpRequest<?> request, Path path) { try { setNetcdf(path); @@ -325,14 +297,12 @@ public class NetcdfService { static class Parameters { final String netcdfFile; - final Bounds bounds; final List<NehrpSiteClass> siteClasses; final List<Imt> imts; Parameters(String netcdfFile) { this.netcdfFile = netcdfFile; var coordinates = netcdf.coordinates(); - bounds = coordinates.region().bounds(); siteClasses = coordinates.siteClasses(); imts = coordinates.imts(); } diff --git a/src/test/java/gov/usgs/earthquake/nshmp/netcdf/NshmNetcdfReaderTests.java b/src/test/java/gov/usgs/earthquake/nshmp/netcdf/NshmNetcdfReaderTests.java index 0148c8cce851f21547d86835b382db73b7e529b7..826c81cbebd2172989ac2436c28a2607f72254d6 100644 --- a/src/test/java/gov/usgs/earthquake/nshmp/netcdf/NshmNetcdfReaderTests.java +++ b/src/test/java/gov/usgs/earthquake/nshmp/netcdf/NshmNetcdfReaderTests.java @@ -1,6 +1,5 @@ package gov.usgs.earthquake.nshmp.netcdf; -import static com.google.common.base.Preconditions.checkState; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -23,15 +22,8 @@ import org.junit.jupiter.params.provider.MethodSource; import com.google.common.io.Resources; import gov.usgs.earthquake.nshmp.data.XySequence; -import gov.usgs.earthquake.nshmp.geo.BorderType; import gov.usgs.earthquake.nshmp.geo.Location; import gov.usgs.earthquake.nshmp.geo.LocationList; -import gov.usgs.earthquake.nshmp.geo.Region; -import gov.usgs.earthquake.nshmp.geo.Regions; -import gov.usgs.earthquake.nshmp.geo.json.Feature; -import gov.usgs.earthquake.nshmp.geo.json.FeatureCollection; -import gov.usgs.earthquake.nshmp.geo.json.GeoJson; -import gov.usgs.earthquake.nshmp.geo.json.Properties; import gov.usgs.earthquake.nshmp.gmm.Imt; import gov.usgs.earthquake.nshmp.gmm.NehrpSiteClass; import gov.usgs.earthquake.nshmp.netcdf.reader.BoundingHazards; @@ -40,17 +32,14 @@ import gov.usgs.earthquake.nshmp.netcdf.reader.StaticHazards; public class NshmNetcdfReaderTests { - static final String CONUS_TEST_FILE = "nshmp-conus-test-fv.0.3.nc"; + // static final String CONUS_TEST_FILE = "nshmp-conus-test-fv.0.3.nc"; + static final String CONUS_TEST_FILE = "nshmp-conus-test-fv.1.0.nc"; static final Path NETCDF_PATH = Paths.get(Resources.getResource(CONUS_TEST_FILE).getPath()); static final String TEST_INVALID_NC_FILE = "invalid-netcdf-file.nc"; static final Path NETCDF_INVALID_FILE = Paths.get( Resources.getResource(TEST_INVALID_NC_FILE).getPath()); - static final String CONUS_TEST_MAP_FILE = "map-netcdf-test-0p05.geojson"; - static final Path CONUS_TEST_MAP_PATH = - Paths.get(Resources.getResource(CONUS_TEST_MAP_FILE).getPath()); - // difference tolerance, until we can incorporate precision into // NshmNetcdfReader public static final double IML_TOL = 1e-6; @@ -62,8 +51,6 @@ public class NshmNetcdfReaderTests { new double[] { -105.3, -105.25, -105.2, -105.15 }; public static final double[] EXPECTED_LATITUDES = new double[] { 39.15, 39.2, 39.25, 39.3 }; - public static final Region EXPECTED_REGION; - static final LocationList BOUNDING_LOCATIONS = LocationList.builder() .add(EXPECTED_LONGITUDES[1], EXPECTED_LATITUDES[1]) .add(EXPECTED_LONGITUDES[1], EXPECTED_LATITUDES[2]) @@ -80,32 +67,66 @@ public class NshmNetcdfReaderTests { new double[] { 0.00233, 0.0265, 0.302, 3.44 }, new double[] { 0.00333, 0.0379, 0.432, 4.92 }); + /** + * old expected bounding hazard (from XML model) + * + * <pre> + * static final List<double[]> HAZARDS = List.of( // [idxSc,idxImt,idxLon,idxLat] + * // lower left bounding hazard + * new double[] { 4.387208E-02, 4.250093E-03, 1.192809E-04, 2.201278E-07 }, // [0,0,1,1] + * new double[] { 6.567874E-02, 5.199003E-03, 6.540930E-05, 6.705638E-08 }, // [0,1,1,1] + * new double[] { 4.127881E-02, 3.905505E-03, 1.221450E-04, 3.597946E-07 }, // [1,0,1,1] + * new double[] { 5.262404E-02, 3.470381E-03, 4.079298E-05, 4.619109E-08 }, // [1,1,1,1] + * // upper left bounding hazard + * new double[] { 4.388691E-02, 4.249376E-03, 1.185702E-04, 2.198896E-07 }, // [0,0,1,2] + * new double[] { 6.564134E-02, 5.175665E-03, 6.480199E-05, 6.684925E-08 }, // [0,1,1,2] + * new double[] { 4.130831E-02, 3.907337E-03, 1.214354E-04, 3.593860E-07 }, // [1,0,1,2] + * new double[] { 5.258384E-02, 3.454936E-03, 4.047655E-05, 4.606202E-08 }, // [1,1,1,2] + * // upper right bounding hazard + * new double[] { 4.346677E-02, 4.125130E-03, 1.135500E-04, 2.171376E-07 }, // [0,0,2,2] + * new double[] { 6.530787E-02, 5.078100E-03, 6.258566E-05, 6.466215E-08 }, // [0,1,2,2] + * new double[] { 4.089805E-02, 3.789999E-03, 1.163111E-04, 3.544692E-07 }, // [1,0,2,2] + * new double[] { 5.224910E-02, 3.379782E-03, 3.912059E-05, 4.462088E-08 }, // [1,1,2,2] + * // lower right bounding hazard + * new double[] { 4.344459E-02, 4.124759E-03, 1.141019E-04, 2.173907E-07 }, // [0,0,2,1] + * new double[] { 6.532912E-02, 5.098603E-03, 6.312435E-05, 6.484549E-08 }, // [0,1,2,1] + * new double[] { 4.086227E-02, 3.787166E-03, 1.168667E-04, 3.549025E-07 }, // [1,0,2,1] + * new double[] { 5.227672E-02, 3.393233E-03, 3.939733E-05, 4.473717E-08 }, // [1,1,2,1] + * // target site hazard + * new double[] { 4.373975E-02, 4.209890E-03, 1.174520E-04, 2.191888E-07 }, // [0,0,t,t] + * new double[] { 6.555848E-02, 5.161043E-03, 6.452592E-05, 6.629702E-08 }, // [0,1,t,t] + * new double[] { 4.115371E-02, 3.868196E-03, 1.202843E-04, 3.581208E-07 }, // [1,0,t,t] + * new double[] { 5.250349E-02, 3.441844E-03, 4.026740E-05, 4.569334E-08 });// [1,1,t,t] + * </pre> + */ + + /* new expected bounding hazard (from JSON model) */ static final List<double[]> HAZARDS = List.of( // [idxSc,idxImt,idxLon,idxLat] // lower left bounding hazard - new double[] { 4.387208E-02, 4.250093E-03, 1.192809E-04, 2.201278E-07 }, // [0,0,1,1] - new double[] { 6.567874E-02, 5.199003E-03, 6.540930E-05, 6.705638E-08 }, // [0,1,1,1] - new double[] { 4.127881E-02, 3.905505E-03, 1.221450E-04, 3.597946E-07 }, // [1,0,1,1] - new double[] { 5.262404E-02, 3.470381E-03, 4.079298E-05, 4.619109E-08 }, // [1,1,1,1] + new double[] { 4.387208E-02, 4.249698E-03, 1.195826E-04, 2.365366E-07 }, // [0,0,1,1] + new double[] { 6.567875E-02, 5.198536E-03, 6.568199E-05, 6.832532E-08 }, // [0,1,1,1] + new double[] { 4.127882E-02, 3.905073E-03, 1.224595E-04, 3.846883E-07 }, // [1,0,1,1] + new double[] { 5.262405E-02, 3.469972E-03, 4.105103E-05, 4.711473E-08 }, // [1,1,1,1] // upper left bounding hazard - new double[] { 4.388691E-02, 4.249376E-03, 1.185702E-04, 2.198896E-07 }, // [0,0,1,2] - new double[] { 6.564134E-02, 5.175665E-03, 6.480199E-05, 6.684925E-08 }, // [0,1,1,2] - new double[] { 4.130831E-02, 3.907337E-03, 1.214354E-04, 3.593860E-07 }, // [1,0,1,2] - new double[] { 5.258384E-02, 3.454936E-03, 4.047655E-05, 4.606202E-08 }, // [1,1,1,2] + new double[] { 4.388691E-02, 4.248897E-03, 1.188715E-04, 2.260914E-07 }, // [0,0,1,2] + new double[] { 6.564135E-02, 5.175152E-03, 6.498308E-05, 6.756911E-08 }, // [0,1,1,2] + new double[] { 4.130831E-02, 3.906819E-03, 1.217608E-04, 3.690529E-07 }, // [1,0,1,2] + new double[] { 5.258383E-02, 3.454501E-03, 4.063948E-05, 4.659643E-08 }, // [1,1,1,2] // upper right bounding hazard - new double[] { 4.346677E-02, 4.125130E-03, 1.135500E-04, 2.171376E-07 }, // [0,0,2,2] - new double[] { 6.530787E-02, 5.078100E-03, 6.258566E-05, 6.466215E-08 }, // [0,1,2,2] - new double[] { 4.089805E-02, 3.789999E-03, 1.163111E-04, 3.544692E-07 }, // [1,0,2,2] - new double[] { 5.224910E-02, 3.379782E-03, 3.912059E-05, 4.462088E-08 }, // [1,1,2,2] + new double[] { 4.346677E-02, 4.124063E-03, 1.138591E-04, 2.234166E-07 }, // [0,0,2,2] + new double[] { 6.530782E-02, 5.077166E-03, 6.276511E-05, 6.542022E-08 }, // [0,1,2,2] + new double[] { 4.089805E-02, 3.788875E-03, 1.166480E-04, 3.642737E-07 }, // [1,0,2,2] + new double[] { 5.224900E-02, 3.378995E-03, 3.928432E-05, 4.518235E-08 }, // [1,1,2,2] // lower right bounding hazard - new double[] { 4.344459E-02, 4.124759E-03, 1.141019E-04, 2.173907E-07 }, // [0,0,2,1] - new double[] { 6.532912E-02, 5.098603E-03, 6.312435E-05, 6.484549E-08 }, // [0,1,2,1] - new double[] { 4.086227E-02, 3.787166E-03, 1.168667E-04, 3.549025E-07 }, // [1,0,2,1] - new double[] { 5.227672E-02, 3.393233E-03, 3.939733E-05, 4.473717E-08 }, // [1,1,2,1] + new double[] { 4.344459E-02, 4.124099E-03, 1.145282E-04, 2.333896E-07 }, // [0,0,2,1] + new double[] { 6.532911E-02, 5.097989E-03, 6.343746E-05, 6.623488E-08 }, // [0,1,2,1] + new double[] { 4.086227E-02, 3.786463E-03, 1.173169E-04, 3.792980E-07 }, // [1,0,2,1] + new double[] { 5.227669E-02, 3.392729E-03, 3.968741E-05, 4.575049E-08 }, // [1,1,2,1] // target site hazard - new double[] { 4.373975E-02, 4.209890E-03, 1.174520E-04, 2.191888E-07 }, // [0,0,t,t] - new double[] { 6.555848E-02, 5.161043E-03, 6.452592E-05, 6.629702E-08 }, // [0,1,t,t] - new double[] { 4.115371E-02, 3.868196E-03, 1.202843E-04, 3.581208E-07 }, // [1,0,t,t] - new double[] { 5.250349E-02, 3.441844E-03, 4.026740E-05, 4.569334E-08 });// [1,1,t,t] + new double[] { 4.373975E-02, 4.209362E-03, 1.177838E-04, 2.328531E-07 }, // [0,0,t,t] + new double[] { 6.555848E-02, 5.160494E-03, 6.478424E-05, 6.745490E-08 }, // [0,1,t,t] + new double[] { 4.115371E-02, 3.867627E-03, 1.206347E-04, 3.789490E-07 }, // [1,0,t,t] + new double[] { 5.250348E-02, 3.441376E-03, 4.050837E-05, 4.653927E-08 });// [1,1,t,t] public static final List<NehrpSiteClass> SITE_CLASSES = List.of(NehrpSiteClass.CD, NehrpSiteClass.C); @@ -117,8 +138,6 @@ public class NshmNetcdfReaderTests { static final double TARGET_LONGITUDE_FRAC; static final double TARGET_LATITUDE_FRAC; - // public static Map<NehrpSiteClass, Map<Imt, double[]>> IMLS = new - // HashMap<>(); public static Map<Imt, double[]> IMLS = new HashMap<>(); static BoundingHazards BOUNDING_HAZARDS; @@ -150,25 +169,6 @@ public class NshmNetcdfReaderTests { BOUNDING_HAZARDS = builder.build(); - // Extract test region from CONUS_TEST_MAP_FILE - FeatureCollection dataRegions = GeoJson.from(CONUS_TEST_MAP_PATH).toFeatureCollection(); - List<Feature> features = dataRegions.features(); - - // From {@code Sites.createSiteRegion()} - checkState(features.size() <= 2, "Only 2 polygon features may be defined"); - int mapRegionIndex = 0; - if (features.size() > 1) { - // don't need to process the rectangular map extents, if present - mapRegionIndex = 1; - } - Feature sitesPoly = features.get(mapRegionIndex); - LocationList sitesPolyBorder = sitesPoly.asPolygonBorder(); - Properties properties = sitesPoly.properties(); - // get region name - either "title" or "name" property??? - String mapName = - properties.getString("title").orElse(properties.getString("name").orElse("Unnamed Map")); - EXPECTED_REGION = Regions.create(mapName, sitesPolyBorder, BorderType.MERCATOR_LINEAR); - var imls = new EnumMap<Imt, double[]>(Imt.class); for (var i = 0; i < IMTS.size(); i++) { imls.put(IMTS.get(i), XS.get(i)); diff --git a/src/test/java/gov/usgs/earthquake/nshmp/netcdf/reader/NetcdfCoordinatesTest.java b/src/test/java/gov/usgs/earthquake/nshmp/netcdf/reader/NetcdfCoordinatesTest.java index 0a07f175997bb5b86a60ec43bf8d2cd8fe0b72ec..8812e0808d5a41004712c220ff1c5d604cae3089 100644 --- a/src/test/java/gov/usgs/earthquake/nshmp/netcdf/reader/NetcdfCoordinatesTest.java +++ b/src/test/java/gov/usgs/earthquake/nshmp/netcdf/reader/NetcdfCoordinatesTest.java @@ -25,21 +25,6 @@ class NetcdfCoordinatesTest { // Check site classes assertEquals(NshmNetcdfReaderTests.SITE_CLASSES, coords.siteClasses()); - // Check region - var expectedRegion = NshmNetcdfReaderTests.EXPECTED_REGION; - var expectedBorder = expectedRegion.border(); - - var actualRegion = coords.region(); - var actualBorder = actualRegion.border(); - - assertEquals(expectedBorder.size(), actualBorder.size()); - assertEquals(expectedBorder.bounds().max, actualBorder.bounds().max); - assertEquals(expectedBorder.bounds().min, actualBorder.bounds().min); - - for (var i = 0; i < expectedBorder.size(); i++) { - assertEquals(expectedBorder.get(i), actualBorder.get(i)); - } - // Check IMLs var actualImls = coords.imls(); assertEquals(NshmNetcdfReaderTests.IMLS.size(), actualImls.size()); diff --git a/src/test/resources/nshmp-conus-test-fv.1.0.nc b/src/test/resources/nshmp-conus-test-fv.1.0.nc new file mode 100644 index 0000000000000000000000000000000000000000..ac2e5d506110070fbba0ac34edb9748d38df4c15 Binary files /dev/null and b/src/test/resources/nshmp-conus-test-fv.1.0.nc differ