Merge branch 'omaha_13.3.1' into development

Conflicts:
	edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/db/dao/GFEDao.java
	edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/reference/MapManager.java
	edexOsgi/com.raytheon.edex.plugin.gfe/src/com/raytheon/edex/plugin/gfe/server/notify/GfeIngestNotificationFilter.java
	edexOsgi/com.raytheon.uf.common.time/src/com/raytheon/uf/common/time/util/TimeUtil.java

Former-commit-id: 2ca7ead62d [formerly 5ec1c01d3a] [formerly 736bb45741] [formerly 736bb45741 [formerly 140765a43e]] [formerly 437a04011a [formerly 736bb45741 [formerly 140765a43e] [formerly 437a04011a [formerly 4a7059ac9b104116fef4d0dab9a0108fb61b5a5c]]]]
Former-commit-id: 437a04011a
Former-commit-id: ba02abb01d1c45e71a88538e220dd9927dcb8c5a [formerly 0f6adbe76d6a5926e99d6caab1841fd3e7bd7349] [formerly 7b27767d7e [formerly 0b48e96314]]
Former-commit-id: 7b27767d7e
Former-commit-id: 47c7f66f2b
This commit is contained in:
Steve Harris 2013-04-01 12:19:04 -05:00
commit 9aca3ab74a
190 changed files with 5293 additions and 2987 deletions

View file

@ -128,5 +128,5 @@
</lineProperty>
</Line>
</linePropertyMap>
<dataPageProperty severePotentialPage="10" convectiveInitiationPage="9" meanWindPage="8" stormRelativePage="7" mixingHeightPage="6" opcDataPage="5" thermodynamicDataPage="4" parcelDataPage="3" summary2Page="2" summary1Page="1"/>
<dataPageProperty numberPagePerDisplay="1" severePotentialPage="10" convectiveInitiationPage="9" meanWindPage="8" stormRelativePage="7" mixingHeightPage="6" opcDataPage="5" thermodynamicDataPage="4" parcelDataPage="3" summary2Page="2" summary1Page="1"/>
</NsharpConfigStore>

View file

@ -100,6 +100,7 @@ import com.raytheon.viz.gfe.core.parm.vcparm.VCModuleJobPool;
* use in PngWriter
* 01/22/2013 #1515 dgilling Increase default size of VCModule thread pool
* to decrease UI hang-ups waiting for results.
* 03/20/2013 #1774 randerso Code cleanup
*
* </pre>
*
@ -243,7 +244,7 @@ public abstract class AbstractParmManager implements IParmManager {
protected DatabaseID productDB;
protected List<DatabaseID> availableDatabases;
protected Set<DatabaseID> availableDatabases;
protected final DatabaseID mutableDb;
@ -320,26 +321,16 @@ public abstract class AbstractParmManager implements IParmManager {
dbCategories = Arrays.asList(prefs.getStringArray("dbTypes"));
this.availableDatabases = getDatabaseInventory();
this.availableDatabases = new HashSet<DatabaseID>(
getDatabaseInventory());
this.dbInvChangeListener = new AbstractGFENotificationObserver<DBInvChangeNotification>(
DBInvChangeNotification.class) {
@Override
public void notify(DBInvChangeNotification notificationMessage) {
List<DatabaseID> newInventory;
List<DatabaseID> additions = new ArrayList<DatabaseID>();
List<DatabaseID> deletions = new ArrayList<DatabaseID>();
newInventory = filterDbIds(notificationMessage.getInventory());
additions.addAll(newInventory);
additions.removeAll(availableDatabases);
deletions.addAll(availableDatabases);
deletions.removeAll(newInventory);
availableDatabases = newInventory;
updatedDatabaseList(availableDatabases, deletions, additions);
updatedDatabaseList(notificationMessage.getDeletions(),
notificationMessage.getAdditions());
}
};
@ -1862,15 +1853,16 @@ public abstract class AbstractParmManager implements IParmManager {
* The list of available parms is updated based on the list of additions and
* deletions.
*
* @param newList
* The full inventory, including new additions and deletions
* @param deletions
* The items being removed from the inventory
* @param additions
* The items being added from the inventory
*/
public void updatedDatabaseList(List<DatabaseID> newList,
List<DatabaseID> deletions, List<DatabaseID> additions) {
public void updatedDatabaseList(List<DatabaseID> deletions,
List<DatabaseID> additions) {
availableDatabases.addAll(additions);
availableDatabases.removeAll(deletions);
List<ParmID> toDelete = new ArrayList<ParmID>();
for (DatabaseID dbId : deletions) {

View file

@ -60,6 +60,7 @@ import com.raytheon.uf.common.dataplugin.gfe.slice.VectorGridSlice;
import com.raytheon.uf.common.dataplugin.gfe.slice.WeatherGridSlice;
import com.raytheon.uf.common.dataplugin.gfe.weather.WeatherKey;
import com.raytheon.uf.common.time.TimeRange;
import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.viz.gfe.Activator;
import com.raytheon.viz.gfe.core.DataManager;
import com.raytheon.viz.gfe.core.griddata.DiscreteGridData;
@ -82,6 +83,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 02/04/2008 chammack Initial Creation
* 03/20/2013 #1774 randerso Use TimeUtil constants
*
* </pre>
*
@ -106,10 +108,10 @@ public class MockParmManager extends AbstractParmManager {
"CST6CDT");
private static final TimeConstraints TC1 = new TimeConstraints(
TimeConstraints.HOUR, TimeConstraints.HOUR, 0);
TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_HOUR, 0);
private static final TimeConstraints TC2 = new TimeConstraints(
13 * TimeConstraints.HOUR, TimeConstraints.DAY, 13);
13 * TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_DAY, 13);
protected Set<Parm> fullParmSet;
@ -662,6 +664,7 @@ public class MockParmManager extends AbstractParmManager {
return gloc;
}
@Override
public Parm getParmInExpr(final String exprName, boolean enableTopo) {
return getParmInExpr(exprName, enableTopo, dataManager
.getSpatialDisplayManager().getActivatedParm());
@ -795,10 +798,12 @@ public class MockParmManager extends AbstractParmManager {
}
@Override
public List<DatabaseID> getIscDatabases() {
return new ArrayList<DatabaseID>();
}
@Override
public ParmID getISCParmID(ParmID pid) {
return new ParmID();
}

View file

@ -111,6 +111,8 @@ import com.raytheon.viz.ui.cmenu.AbstractRightClickAction;
* 11/30/2012 #1328 mschenke Made GFE use descriptor for time matching
* and time storage and manipulation
* 01/22/2013 #1518 randerso Removed use of Map with Parms as keys
* 03/28/2013 #1838 randerso Fixed selected time range when Select Grids When
* Stepping is enabled. Cleaned up deprecated warnings.
*
* </pre>
*
@ -563,8 +565,7 @@ public class GridCanvas extends Canvas implements IMessageClient {
List<String> popUpActions = new ArrayList<String>(0);
if (gmEditActions.length > 0) {
// Only show tools this parm supports
String[] parmTools = DataManager
.getCurrentInstance()
String[] parmTools = dataMgr
.getSmartToolInterface().listTools(parm);
List<String> parmToolList = Arrays
.asList(parmTools);
@ -815,8 +816,7 @@ public class GridCanvas extends Canvas implements IMessageClient {
grid = null;
}
grid.changeValidTime(lastDestinationTR, false);
grid.updateHistoryToModified(DataManager.getCurrentInstance()
.getWsId());
grid.updateHistoryToModified(dataMgr.getWsId());
newGrids.add(grid);
@ -924,8 +924,6 @@ public class GridCanvas extends Canvas implements IMessageClient {
Date clickTime = gridManager.getUtil().pixelToDate(e.x);
GridID clickGridID = new GridID(parm, clickTime);
gridManager.setSelectedTime(clickTime);
// make it active, make it inactive depending upon okToEdit
try {
if (clickGridID.grid() != null && clickGridID.grid().isOkToEdit()) {
@ -967,6 +965,8 @@ public class GridCanvas extends Canvas implements IMessageClient {
statusHandler.handle(Priority.PROBLEM, "Error activating parm "
+ parm.getParmID().compositeNameUI(), e1);
}
gridManager.setSelectedTime(clickTime);
}
private void resize() {

View file

@ -30,15 +30,16 @@ import org.junit.Test;
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData;
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData.ProjectionType;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord.GridType;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.TimeConstraints;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord.GridType;
import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DBit;
import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DFloat;
import com.raytheon.uf.common.dataplugin.gfe.slice.ScalarGridSlice;
import com.raytheon.uf.common.time.TimeRange;
import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.viz.gfe.core.parm.MockParm;
import com.raytheon.viz.gfe.core.wxvalue.ScalarWxValue;
import com.vividsolutions.jts.geom.Coordinate;
@ -55,6 +56,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 26, 2008 rbell Initial creation
* Mar 20, 2013 #1774 randerso Use TimeUtil constants
*
* </pre>
*
@ -106,8 +108,8 @@ public class ScalarGridDataTest {
new Point(4, 4), new Coordinate(45, 30), new Coordinate(9, 9),
"CST6CDT");
TimeConstraints testTC1 = new TimeConstraints(TimeConstraints.HOUR,
TimeConstraints.HOUR, 0);
TimeConstraints testTC1 = new TimeConstraints(
TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_HOUR, 0);
GridParmInfo testGPI1 = new GridParmInfo(testPID1, testGL1,
GridType.SCALAR, "F", "Temperature", -20f, 80f, 2, false,

View file

@ -29,15 +29,16 @@ import org.junit.Test;
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData;
import com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData.ProjectionType;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord.GridType;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.TimeConstraints;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord.GridType;
import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DBit;
import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DFloat;
import com.raytheon.uf.common.dataplugin.gfe.slice.VectorGridSlice;
import com.raytheon.uf.common.time.TimeRange;
import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.viz.gfe.core.parm.MockParm;
import com.raytheon.viz.gfe.core.wxvalue.VectorWxValue;
import com.vividsolutions.jts.geom.Coordinate;
@ -53,7 +54,8 @@ import com.vividsolutions.jts.geom.Coordinate;
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 26, 2008 rbell Initial creation
* Mar 26, 2008 rbell Initial creation
* Mar 20, 2013 #1774 randerso Use TimeUtil constants
*
* </pre>
*
@ -66,8 +68,8 @@ public class VectorGridDataTest {
private final float testFA1[] = new float[145 * 145];
{
for (int i = 0; i < 145 * 145; i++) {
this.testFA1[i] = (float) (i + (i / (Math.pow(10.0, (i + "")
.length()))));
this.testFA1[i] = (float) (i + (i / (Math.pow(10.0,
(i + "").length()))));
}
}
@ -104,7 +106,7 @@ public class VectorGridDataTest {
"CST6CDT");
private final TimeConstraints testTC1 = new TimeConstraints(
TimeConstraints.HOUR, TimeConstraints.HOUR, 0);
TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_HOUR, 0);
private final GridParmInfo testGPI1 = new GridParmInfo(this.testPID1,
this.testGL1, GridType.VECTOR, "F", "Temperature", -20f, 80f, 2,

View file

@ -42,6 +42,7 @@ import com.raytheon.uf.common.dataplugin.gfe.grid.Grid2DFloat;
import com.raytheon.uf.common.dataplugin.gfe.slice.IGridSlice;
import com.raytheon.uf.common.dataplugin.gfe.slice.ScalarGridSlice;
import com.raytheon.uf.common.time.TimeRange;
import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.viz.gfe.GFEOperationFailedException;
import com.raytheon.viz.gfe.core.DataManager;
import com.raytheon.viz.gfe.core.griddata.AbstractGridData;
@ -64,6 +65,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 02/21/2008 chammack Initial Creation
* 03/20/2013 #1774 randerso Use TimeUtil constants
*
* </pre>
*
@ -84,7 +86,7 @@ public class TestParm {
"CST6CDT");
private static final TimeConstraints TC1 = new TimeConstraints(
TimeConstraints.HOUR, TimeConstraints.HOUR, 0);
TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_HOUR, 0);
private static GridParmInfo gpi;
@ -136,7 +138,7 @@ public class TestParm {
"CST6CDT");
private final TimeConstraints testTC1 = new TimeConstraints(
TimeConstraints.HOUR, TimeConstraints.HOUR, 0);
TimeUtil.SECONDS_PER_HOUR, TimeUtil.SECONDS_PER_HOUR, 0);
private final GridParmInfo testGPI1 = new GridParmInfo(this.testPID1,
this.testGL1, GridType.SCALAR, "F", "Temperature", -20f, 80f, 2,

View file

@ -170,6 +170,16 @@ public abstract class AbstractVizPerspectiveManager implements
try {
mgr.activateDefaultTool(((AbstractEditor) part)
.getDefaultTool());
if (mgr.getToolManager().getSelectedModalTools()
.isEmpty()) {
// Hack due to tool activation not sending whether
// it should be activated or deactivated and is just
// toggling instead. TODO: Make AbstractModalTool
// required command parameter for activate or
// deactivate
mgr.activateDefaultTool(((AbstractEditor) part)
.getDefaultTool());
}
} catch (VizException e) {
statusHandler.handle(Priority.SIGNIFICANT,
"Error activating tool set", e);

View file

@ -32,9 +32,7 @@ import org.eclipse.ui.commands.ICommandService;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.Activator;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.status.StatusConstants;
/**
* Defines a Tool Manager, which handles the tool registrations and activations
@ -112,19 +110,28 @@ public class ModalToolManager {
*/
public synchronized void activateToolSet(String defaultTool)
throws VizException {
try {
ICommandService service = (ICommandService) PlatformUI
.getWorkbench().getService(ICommandService.class);
if (defaultTool != null) {
Command c = service.getCommand(defaultTool);
c.executeWithChecks(new ExecutionEvent(c,
new HashMap<Object, Object>(), null, null));
boolean found = false;
for (AbstractModalTool tool : toolMap.values()) {
if (tool != null && tool.commandId.equals(defaultTool)) {
found = true;
break;
}
} catch (Exception e) {
statusHandler.handle(Priority.CRITICAL,
"Error loading tool set", e);
}
if (!found) {
try {
ICommandService service = (ICommandService) PlatformUI
.getWorkbench().getService(ICommandService.class);
if (defaultTool != null) {
Command c = service.getCommand(defaultTool);
c.executeWithChecks(new ExecutionEvent(c,
new HashMap<Object, Object>(), null, null));
}
} catch (Exception e) {
statusHandler.handle(Priority.CRITICAL,
"Error loading tool set", e);
throw new VizException("Error loading tool set", e);
throw new VizException("Error loading tool set", e);
}
}
}

View file

@ -134,7 +134,8 @@ import com.vividsolutions.jts.geom.Polygon;
* setPolygonLocked(true) below conSelected() is called in corSelected(),
* and removed it from updateListSelected().
* Feb 18, 2013 #1633 rferrel Changed checkFollowupSelection to use SimulatedTime.
*
* Mar 28, 2013 DR 15974 D. Friedman Do not track removed GIDs.
*
* </pre>
*
* @author chammack
@ -1587,7 +1588,6 @@ public class WarngenDialog extends CaveSWTDialog implements
warngenLayer.getStormTrackState().endTime = null;
WarningAction action = WarningAction.valueOf(data.getAct());
warngenLayer.setWarningAction(action);
warngenLayer.initRemovedGids();
if (action == WarningAction.CON) {
oldWarning = conSelected(data);
} else if (action == WarningAction.COR) {

View file

@ -160,6 +160,10 @@ import com.vividsolutions.jts.io.WKTReader;
* 12/18/2012 DR 15571 Qinglu Lin Resolved coordinate issue in TML line caused by clicking Restart button.
* 01/24/2013 DR 15723 Qinglu Lin Added initRemovedGids() and updated updateWarnedAreas() to prevent the removed
* counties from being re-hatched.
* 03/06/2013 DR 15831 D. Friedman Use area inclusion filter in followups.
* 03/28/2013 DR 15973 Qinglu Lin Added adjustVertex() and applied it invalid polygon.
* 03/28/2013 DR 15974 D. Friedman Preserve the set of selected counties when recreating the polygon from the
* hatched area and remember marked counties outside the polygon on followup.
* </pre>
*
* @author mschenke
@ -278,7 +282,9 @@ public class WarngenLayer extends AbstractStormTrackResource {
try {
Polygon hatched = polygonUtil.hatchWarningArea(
warningPolygon, warningArea);
warningPolygon,
removeCounties(warningArea,
state.getFipsOutsidePolygon()));
if (hatched != null) {
// DR 15559
Coordinate[] coords = hatched.getCoordinates();
@ -287,7 +293,11 @@ public class WarngenLayer extends AbstractStormTrackResource {
GeometryFactory gf = new GeometryFactory();
LinearRing lr = gf.createLinearRing(coords);
hatchedArea = gf.createPolygon(lr, null);
hatchedWarningArea = createWarnedArea(latLonToLocal(hatchedArea));
if (! hatchedArea.isValid())
hatchedArea = adjustVertex(hatchedArea);
hatchedWarningArea = createWarnedArea(
latLonToLocal(hatchedArea),
latLonToLocal(warningArea));
} else {
this.hatchedArea = null;
this.hatchedWarningArea = null;
@ -387,8 +397,6 @@ public class WarngenLayer extends AbstractStormTrackResource {
private WarningAction warningAction = WarningAction.NEW;
private final Set<String> removedGids = new HashSet<String>();
static {
for (int i = 0; i < 128; i++) {
if (i % 32 == 0) {
@ -1059,11 +1067,15 @@ public class WarngenLayer extends AbstractStormTrackResource {
public void setOldWarningPolygon(AbstractWarningRecord record) {
if (record != null) {
state.setOldWarningPolygon((Polygon) record.getGeometry().clone());
state.setOldWarningArea(getWarningAreaFromPolygon(
state.getOldWarningPolygon(), record));
Geometry oldArea = getWarningAreaFromPolygon(
state.getOldWarningPolygon(), record);
if (oldArea.getUserData() instanceof Set)
state.setFipsOutsidePolygon((Set<String>) oldArea.getUserData());
state.setOldWarningArea(oldArea);
} else {
state.setOldWarningArea(null);
state.setOldWarningPolygon(null);
state.setFipsOutsidePolygon(null);
}
}
@ -1114,7 +1126,7 @@ public class WarngenLayer extends AbstractStormTrackResource {
Map<String, String[]> countyMap = FipsUtil
.parseCountyHeader(activeTableRecord.getUgcZone());
// get area with precalculated area
activeTableRecord.setGeometry(getArea(area, countyMap));
activeTableRecord.setGeometry(getArea(area, countyMap, false));
}
}
@ -1154,35 +1166,59 @@ public class WarngenLayer extends AbstractStormTrackResource {
}
/**
* Give the intersection area and polygon, build the area for the county map
* Given the intersection area and polygon, build the area for the county
* map
*
* @param area
* @param polygon
* @param countyMap
* @return
* @param includeAllEntries
* if true, ensure all entries in countyMap are represented in
* the result even if not in {@code area}.
* @return the resulting area. If includeAllEntries is true and there are
* areas in countyMap not inside {@code area}, the user data will be
* set to a Set of the FIPS IDs (or equivalent) of those outside
* areas.
*/
private Geometry getArea(Geometry area, Map<String, String[]> countyMap) {
private Geometry getArea(Geometry area, Map<String, String[]> countyMap,
boolean includeAllEntries) {
if (area == null) {
return null;
}
// Now remove counties not present in warning
Set<String> idsOutsidePolygon = null;
Set<String> fipsOutsidePolygon = null;
if (includeAllEntries) {
idsOutsidePolygon = new HashSet<String>();
for (Map.Entry<String, String[]> entry : countyMap.entrySet()) {
String state = entry.getKey();
for (String id : entry.getValue()) {
idsOutsidePolygon.add(state + '-' + id);
}
}
}
List<Geometry> geoms = new ArrayList<Geometry>();
GeometryUtil.buildGeometryList(geoms, area);
List<Geometry> newList = new ArrayList<Geometry>();
boolean isMarineZone = configuration.getGeospatialConfig()
.getAreaSource().equalsIgnoreCase(MARINE);
for (Geometry geom : geoms) {
CountyUserData data = (CountyUserData) geom.getUserData();
String fips = null;
String[] ids = null;
if (configuration.getGeospatialConfig().getAreaSource()
.equalsIgnoreCase(MARINE)) {
if (isMarineZone) {
fips = String.valueOf(data.entry.attributes.get(configuration
.getHatchedAreaSource().getFipsField()));
if (countyMap.containsKey(fips.substring(0, 2))) {
ids = countyMap.get(fips.substring(0, 2));
for (String id : ids) {
if (fips.endsWith(id)) {
if (idsOutsidePolygon != null) {
idsOutsidePolygon.remove(fips.substring(0, 2) + '-' + id);
}
newList.add(geom);
break;
}
@ -1199,6 +1235,9 @@ public class WarngenLayer extends AbstractStormTrackResource {
.getFipsField()));
for (String id : ids) {
if (fips.endsWith(id)) {
if (idsOutsidePolygon != null) {
idsOutsidePolygon.remove(stateAbbr + '-' + id);
}
newList.add(geom);
break;
}
@ -1206,8 +1245,39 @@ public class WarngenLayer extends AbstractStormTrackResource {
}
}
}
return area.getFactory().createGeometryCollection(
if (includeAllEntries && !idsOutsidePolygon.isEmpty()) {
if (geoData != null) {
fipsOutsidePolygon = new HashSet<String>();
for (GeospatialData f : geoData.features) {
CountyUserData data = (CountyUserData) f.geometry
.getUserData();
String fips = String.valueOf(data.entry.attributes
.get(configuration.getHatchedAreaSource()
.getFipsField()));
String key;
if (isMarineZone) {
key = fips.substring(0, 2) + '-' + fips.substring(3);
} else {
String stateAbbr = String.valueOf(data.entry.attributes
.get(configuration.getHatchedAreaSource()
.getAreaNotationField()));
key = stateAbbr + '-' + fips.substring(2);
}
if (idsOutsidePolygon.contains(key)) {
newList.add((Geometry) f.geometry.clone());
fipsOutsidePolygon.add(getFips(f));
}
}
}
}
Geometry result = area.getFactory().createGeometryCollection(
newList.toArray(new Geometry[newList.size()]));
if (fipsOutsidePolygon != null)
result.setUserData(fipsOutsidePolygon);
return result;
}
/**
@ -1219,7 +1289,7 @@ public class WarngenLayer extends AbstractStormTrackResource {
* @return
*/
private Geometry getArea(Polygon polygon, Map<String, String[]> countyMap) {
return getArea(buildArea(polygon), countyMap);
return getArea(buildArea(polygon), countyMap, true);
}
/**
@ -1250,6 +1320,10 @@ public class WarngenLayer extends AbstractStormTrackResource {
}
}
public void updateWarnedAreas(boolean snapHatchedAreaToPolygon) throws VizException {
updateWarnedAreas(snapHatchedAreaToPolygon, false);
}
/**
*
* @param snapHatchedAreaToPolygon
@ -1257,7 +1331,7 @@ public class WarngenLayer extends AbstractStormTrackResource {
* eliminated.
* @throws VizException
*/
public void updateWarnedAreas(boolean snapHatchedAreaToPolygon)
public void updateWarnedAreas(boolean snapHatchedAreaToPolygon, boolean preservedSelection)
throws VizException {
if (getPolygon() == null) {
return;
@ -1268,7 +1342,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
Geometry warningArea = state.getWarningArea();
Geometry warningPolygon = state.getWarningPolygon();
Geometry newWarningArea = createWarnedArea(latLonToLocal((snapHatchedAreaToPolygon || warningArea == null) ? warningPolygon
: warningArea));
: warningArea),
preservedSelection && warningArea != null ? latLonToLocal(warningArea) : null);
updateWarnedAreaState(newWarningArea, snapHatchedAreaToPolygon);
System.out.println("determining hatchedArea took "
@ -1279,26 +1354,63 @@ public class WarngenLayer extends AbstractStormTrackResource {
* Creates a warning area based on the hatched area in local coordinates
*
* @param hatchedArea
* @param preservedSelection
* if not null, the result contains all entities in this Geometry
* even if they do not intersect hatchedArea or do not pass the
* inclusion filter
* @return
*/
private Geometry createWarnedArea(Geometry hatchedArea) {
private Geometry createWarnedArea(Geometry hatchedArea, Geometry preservedSelection) {
Geometry oldWarningPolygon = latLonToLocal(state.getOldWarningPolygon());
Geometry oldWarningArea = latLonToLocal(state.getOldWarningArea());
Geometry newHatchedArea = null;
Set<String> selectedFips = null;
List<Geometry> selectedGeoms = null;
if (preservedSelection != null)
selectedFips = getAllFipsInArea(preservedSelection);
// Loop through each of our counties returned from the query
for (GeospatialData f : geoData.features) {
// get the geometry of the county and make sure it intersects
// with our hatched area
PreparedGeometry prepGeom = (PreparedGeometry) f.attributes
.get(GeospatialDataList.LOCAL_PREP_GEOM);
Geometry geom = (Geometry) f.attributes
.get(GeospatialDataList.LOCAL_GEOM);
Geometry intersection = null;
try {
// Get intersection between county and hatched boundary
intersection = GeometryUtil.intersection(hatchedArea, prepGeom);
if (oldWarningArea != null) {
intersection = GeometryUtil.intersection(intersection, oldWarningArea);
}
if (intersection.isEmpty()) {
continue;
if (selectedFips == null
|| !selectedFips.contains(getFips(f))) {
continue;
} else if (! selectedFips.isEmpty()) {
/*
* Add whatever part of the area was previously hatched
* despite being outside the new polygon.
*/
if (selectedGeoms == null) {
selectedGeoms = new ArrayList<Geometry>();
GeometryUtil.buildGeometryList(selectedGeoms, preservedSelection);
}
intersection = null;
String prefix = GeometryUtil.getPrefix(f.geometry.getUserData());
for (Geometry g : selectedGeoms) {
if (g.getUserData() != null) {
if (prefix.equals(GeometryUtil.getPrefix(g.getUserData()))) {
intersection = intersection == null ? g :
GeometryUtil.union(intersection, g);
}
}
}
if (intersection == null) {
// This part of the area was not previously selected.
continue;
}
}
}
} catch (RuntimeException e) {
continue;
@ -1306,33 +1418,15 @@ public class WarngenLayer extends AbstractStormTrackResource {
}
try {
double ratio = intersection.getArea() / geom.getArea();
double ratioInPercent = ratio * 100.;
Double areaOfGeom = (Double) f.attributes.get(AREA);
double areaInKmSqOfIntersection = meterSqToKmSq
.convert(areaOfGeom * ratio);
boolean includeArea = false;
if (getConfiguration().getHatchedAreaSource()
.getInclusionAndOr().equalsIgnoreCase("AND")) {
if ((ratioInPercent >= getConfiguration()
.getHatchedAreaSource().getInclusionPercent())
&& (areaInKmSqOfIntersection > getConfiguration()
.getHatchedAreaSource().getInclusionArea())) {
includeArea = true;
}
} else {
if ((ratioInPercent >= getConfiguration()
.getHatchedAreaSource().getInclusionPercent())
|| (areaInKmSqOfIntersection > getConfiguration()
.getHatchedAreaSource().getInclusionArea())) {
includeArea = true;
}
}
if (includeArea
&& (oldWarningPolygon == null || prepGeom
.intersects(oldWarningPolygon))) {
boolean include;
if (selectedFips != null)
include = selectedFips.contains(getFips(f));
else
include = filterArea(f, intersection, true)
&& (oldWarningPolygon == null
|| prepGeom.intersects(oldWarningPolygon)
|| isOldAreaOutsidePolygon(f));
if (include) {
if (newHatchedArea == null) {
newHatchedArea = intersection;
} else {
@ -1397,31 +1491,51 @@ public class WarngenLayer extends AbstractStormTrackResource {
state.resetMarked();
} else if (warningPolygon != null) {
// want intersection of warningPolygon and oldWarningArea
Set<String> selectedGids = new HashSet<String>(
Arrays.asList(GeometryUtil.getGID(newHatchedArea)));
Geometry selectedArea = newHatchedArea;
newHatchedArea = GeometryUtil.intersection(warningPolygon,
oldWarningArea);
if (removedGids.size() > 0) {
Set<String> newGids = new HashSet<String>(
Arrays.asList(GeometryUtil.getGID(newHatchedArea)));
if (!selectedGids.equals(newGids)) {
// Remove areas with gid in removedGids
List<Geometry> areas = new ArrayList<Geometry>(
newHatchedArea.getNumGeometries());
Set<String> seenGids = new HashSet<String>();
for (int n = 0; n < newHatchedArea.getNumGeometries(); ++n) {
Geometry newArea = newHatchedArea.getGeometryN(n);
String[] gids = GeometryUtil.getGID(newArea);
boolean flag = false;
for (String gid : gids) {
if (removedGids.contains(gid)) {
if (! selectedGids.contains(gid)) {
flag = true;
break;
}
}
if (!flag) {
areas.add(newArea);
seenGids.addAll(Arrays.asList(gids));
}
}
if (areas.size() != newHatchedArea.getNumGeometries()) {
// Areas were removed, recreate newHatchedArea
newHatchedArea = GeometryUtil.union(areas
.toArray(new Geometry[0]));
selectedGids.removeAll(seenGids);
if (!selectedGids.isEmpty()) {
for (int n = 0; n < selectedArea.getNumGeometries(); ++n) {
Geometry area = selectedArea.getGeometryN(n);
String[] gids = GeometryUtil.getGID(area);
boolean flag = false;
for (String gid : gids) {
if (selectedGids.contains(gid)) {
flag = true;
break;
}
}
if (flag)
areas.add(area);
}
}
newHatchedArea = GeometryUtil.union(areas
.toArray(new Geometry[0]));
}
}
}
@ -1470,6 +1584,94 @@ public class WarngenLayer extends AbstractStormTrackResource {
warningAreaChanged();
}
}
/** Determine if the given area of the reference area passes the
* inclusion filter. Subroutine of {@link #filterArea}.
* @param areaToConsider
* @param wholeArea
* @param areaInMetersSq
* @param anyAmountOfArea
* @return
*/
private boolean filterCheck(Geometry areaToConsider, Geometry wholeArea,
double areaInMetersSq) {
double ratio = areaToConsider.getArea() / wholeArea.getArea();
double ratioInPercent = ratio * 100.;
double areaInKmSqOfIntersection = meterSqToKmSq.convert(areaInMetersSq
* ratio);
boolean percentOk = ratioInPercent >= getConfiguration()
.getHatchedAreaSource().getInclusionPercent();
boolean areaOk = areaInKmSqOfIntersection > getConfiguration()
.getHatchedAreaSource().getInclusionArea();
return getConfiguration().getHatchedAreaSource().getInclusionAndOr()
.equalsIgnoreCase("AND") ?
percentOk && areaOk : percentOk || areaOk;
}
/** Determine if a feature should be included based on how much of it
* is hatched and the configured inclusion criteria.
* @param feature
* @param featureAreaToConsider the portion of the feature that is hatched
* @param localCoordinates if true, use local CRS; otherwise, use lat/lon
* @param anyAmountOfArea if true, ignore the configured criteria and
* include the feature if event a small amount is hatched.
* @return true if the feature should be included
*/
private boolean filterArea(GeospatialData feature, Geometry featureAreaToConsider, boolean localCRS) {
Geometry geom = localCRS ?
(Geometry) feature.attributes.get(GeospatialDataList.LOCAL_GEOM) :
feature.geometry;
double areaOfGeom = (Double) feature.attributes.get(AREA);
if (filterCheck(featureAreaToConsider, geom, areaOfGeom))
return true;
else if (state.getOldWarningArea() != null) {
/*
* Second chance: If the county slipped by the filter in the initial
* warning, allow it now as long as the hatched area is (nearly) the
* same as the hatched area in the initial warning.
*
* This test assumes that the followup filter is not more permissive
* that the initial warning filter. OTOH, if the followup filter is
* more permissive, this test is not really necessary.
*/
Geometry oldWarningArea = state.getOldWarningArea();
if (localCRS)
oldWarningArea = latLonToLocal(oldWarningArea);
List<Geometry> geoms = new ArrayList<Geometry>();
GeometryUtil.buildGeometryList(geoms, oldWarningArea);
Geometry oldSelectedArea = null;
String prefix = GeometryUtil.getPrefix(feature.geometry.getUserData());
for (Geometry g : geoms) {
if (g.getUserData() != null) {
if (prefix.equals(GeometryUtil.getPrefix(g.getUserData()))) {
oldSelectedArea = oldSelectedArea == null ? g :
GeometryUtil.union(oldSelectedArea, g);
}
}
}
if (oldSelectedArea != null) {
double ratioOfOldArea = featureAreaToConsider.getArea() /
oldSelectedArea.getArea();
/*
* Ideally, we would only allow the exact same area, but due to
* possible loss of precision in all of the calculations, we
* allow >= 0.999.
*/
return ratioOfOldArea >= .999
&& !filterCheck(oldSelectedArea, geom, areaOfGeom);
}
}
return false;
}
private boolean isOldAreaOutsidePolygon(GeospatialData f) {
Set<String> fipsOutsidePolygon = state.getFipsOutsidePolygon();
if (fipsOutsidePolygon != null)
return fipsOutsidePolygon.contains(getFips(f));
return false;
}
/**
* Warned area to shade in lat/lon space
@ -1888,7 +2090,7 @@ public class WarngenLayer extends AbstractStormTrackResource {
state.setWarningPolygon(warnPolygon);
state.setWarningArea(getWarningAreaFromPolygon(
state.getWarningPolygon(), record));
updateWarnedAreas(true);
updateWarnedAreas(true, true);
}
private DataTime recordFrameTime(AbstractWarningRecord warnRecord) {
@ -2266,9 +2468,6 @@ public class WarngenLayer extends AbstractStormTrackResource {
}
state.setWarningArea(tmp);
for (String gid : gids) {
removedGids.add(gid);
}
} else {
String featureFips = getFips(f);
Collection<GeospatialData> dataWithFips = getDataWithFips(featureFips);
@ -2277,7 +2476,8 @@ public class WarngenLayer extends AbstractStormTrackResource {
Set<String> fipsIds = getAllFipsInArea(oldWarningArea);
if (fipsIds.contains(featureFips) == false) {
break;
} else if (oldWarningPolygon.contains(point) == true) {
} else if (oldWarningPolygon.contains(point) == true
|| isOldAreaOutsidePolygon(f)) {
// Get intersecting parts for each geom with
// matching fips
List<Geometry> fipsParts = new ArrayList<Geometry>(
@ -2294,10 +2494,9 @@ public class WarngenLayer extends AbstractStormTrackResource {
geom = GeometryUtil.intersection(
warningPolygon, geom);
}
state.setWarningArea(GeometryUtil.union(
state.getWarningArea(), geom));
for (String gid : gids) {
removedGids.remove(gid);
if (filterArea(f, geom, false)) {
state.setWarningArea(GeometryUtil.union(
state.getWarningArea(), geom));
}
}
} else {
@ -2335,6 +2534,23 @@ public class WarngenLayer extends AbstractStormTrackResource {
.getFipsField());
}
private String getFips(Geometry g) {
Object o = g.getUserData();
if (o != null) {
return getFips(((CountyUserData) o).entry);
} else {
for (int n = 0; n < g.getNumGeometries(); ++n) {
Geometry g2 = g.getGeometryN(n);
if (g != g2) {
String fips = getFips(g2);
if (fips != null)
return fips;
}
}
}
return null;
}
private void warningAreaChanged() {
state.snappedToArea = false;
if (areaHatcher != null) {
@ -2363,13 +2579,20 @@ public class WarngenLayer extends AbstractStormTrackResource {
}
private Geometry removeCounty(Geometry warningArea, String fipsToRemove) {
Set<String> set = new HashSet<String>();
set.add(fipsToRemove);
return removeCounties(warningArea, set);
}
private Geometry removeCounties(Geometry warningArea, Set<String> fipsToRemove) {
if (fipsToRemove == null || fipsToRemove.isEmpty())
return warningArea;
List<Geometry> toKeep = new ArrayList<Geometry>(
warningArea.getNumGeometries());
for (int n = 0; n < warningArea.getNumGeometries(); ++n) {
Geometry area = warningArea.getGeometryN(n);
CountyUserData userData = (CountyUserData) area.getUserData();
String areaFips = getFips(userData.entry);
if (fipsToRemove.equals(areaFips) == false) {
String areaFips = getFips(area);
if (fipsToRemove.contains(areaFips) == false) {
toKeep.add(area);
}
}
@ -2571,7 +2794,113 @@ public class WarngenLayer extends AbstractStormTrackResource {
this.warningAction = warningAction;
}
public void initRemovedGids() {
removedGids.clear();
/**
* Adjust the location of vertexes that cause polygon self-crossing.
*/
private Polygon adjustVertex(Polygon p) {
GeometryFactory gf = new GeometryFactory();
LinearRing lr;
Coordinate coord[] = p.getCoordinates();
int length = coord.length;
Coordinate intersectCoord = null;
int index[] = new int[6];
LineSegment ls1, ls2;
double d[] = new double[6];
int indexOfTheOtherEnd[] = new int[2];
boolean isPolygonValid = false;
outerLoop: for (int skippedSegment = 1; skippedSegment < length - 3; skippedSegment++) {
for (int i = 0; i < length - 1; i++) {
index[0] = i;
index[1] = index[0] + 1;
index[2] = index[1] + skippedSegment;
if (index[2] >= length)
index[2] = index[2] - length + 1;
index[3] = index[2] + 1;
if (index[3] >= length)
index[3] = index[3] - length + 1;
ls1 = new LineSegment(coord[index[0]],coord[index[1]]);
ls2 = new LineSegment(coord[index[2]],coord[index[3]]);
intersectCoord = ls1.intersection(ls2);
if (intersectCoord != null) {
for (int j = 0; j < index.length-2; j++) {
d[j] = calculateDistance(intersectCoord,coord[index[j]]);
}
if (d[0] < d[1]) {
index[4] = index[0];
d[4] = d[0];
indexOfTheOtherEnd[0] = index[1];
} else {
index[4] = index[1];
d[4] = d[1];
indexOfTheOtherEnd[0] = index[0];
}
if (d[2] < d[3]) {
index[5] = index[2];
d[5] = d[2];
indexOfTheOtherEnd[1] = index[3];
} else {
index[5] = index[3];
d[5] = d[3];
indexOfTheOtherEnd[1] = index[2];
}
// index of the vertex on a line segment (line segment A), which will be moved along line segment A.
int replaceIndex;
// index of the vertex at the other end of line segment A.
int theOtherIndex;
if (d[4] < d[5]) {
replaceIndex = index[4];
theOtherIndex = indexOfTheOtherEnd[0];
} else {
replaceIndex= index[5];
theOtherIndex = indexOfTheOtherEnd[1];
}
// move the bad vertex, which is on line segment A and has the shortest distance to intersectCoord,
// along line segment A to the other side of line segment B which intersects with line segment A.
double delta;
double min = 0.00001;
if (Math.abs(intersectCoord.x - coord[replaceIndex].x) < min) {
// move the bad vertex along a vertical line segment.
delta = intersectCoord.y - coord[theOtherIndex].y;
coord[replaceIndex].y += 0.01 * (delta / Math.abs(delta));
} else if (Math.abs(intersectCoord.y - coord[replaceIndex].y) < min) {
// move the bad vertex along a horizontal line segment.
delta = intersectCoord.x - coord[theOtherIndex].x;
coord[replaceIndex].x += 0.01 * (delta / Math.abs(delta));
} else {
// move the bad vertex along a line segment which is neither vertical nor horizontal.
double slope = computeSlope(coord, replaceIndex, theOtherIndex);
delta = coord[theOtherIndex].y - intersectCoord.y;
coord[replaceIndex].y = intersectCoord.y + 0.005 * (delta / Math.abs(delta));
coord[replaceIndex].x = (coord[replaceIndex].y - coord[theOtherIndex].y) / slope
+ coord[theOtherIndex].x;
}
PolygonUtil.round(coord, 2);
if (replaceIndex == 0)
coord[length-1] = new Coordinate(coord[replaceIndex]);
else if (replaceIndex == length - 1)
coord[0] = new Coordinate(coord[replaceIndex]);
lr = gf.createLinearRing(coord);
p = gf.createPolygon(lr, null);
isPolygonValid = p.isValid();
if (isPolygonValid)
break outerLoop;
}
}
}
return p;
}
private double calculateDistance(Coordinate c1, Coordinate c2) {
return Math.sqrt(Math.pow(c1.x - c2.x, 2) + Math.pow(c1.y - c2.y, 2));
}
public double computeSlope(Coordinate[] coords, int i, int j) {
double min = 1.0E-08;
double dx = coords[i].x-coords[j].x;
double slope = 0.0;
if (Math.abs(dx)>min) {
slope = (coords[i].y-coords[j].y)/dx;
}
return slope;
}
}

View file

@ -63,6 +63,7 @@ import com.vividsolutions.jts.geom.Polygon;
* AddVertexAction, DeleteVertextAction and MoveElementAction inner classes.
* Jan 30, 2013 15439 Qinglu Lin Code were added to prevent nullPointException from occurring
* when c2 is null for "case SINGLE_POINT" in move().
* Mar 28, 2013 DR 15974 D. Friedman Do not track removed GIDs.
*
* </pre>
*
@ -360,7 +361,6 @@ public class WarngenUIManager extends InputAdapter {
}
private void move(int x, int y) {
warngenLayer.initRemovedGids();
IDisplayPaneContainer container = warngenLayer.getResourceContainer();
WarngenUIState state = warngenLayer.getWarngenState();
@ -416,7 +416,6 @@ public class WarngenUIManager extends InputAdapter {
return;
}
warngenLayer.initRemovedGids();
Coordinate[] coords = warngenLayer.getPolygon().getCoordinates();
int idx = StormTrackUIManager.getCoordinateIndex(warngenLayer,
@ -519,7 +518,6 @@ public class WarngenUIManager extends InputAdapter {
private class MoveElementAction extends AbstractRightClickAction {
@Override
public void run() {
warngenLayer.initRemovedGids();
moveType = MoveType.ALL_POINTS;
movePointIndex = StormTrackUIManager.getCoordinateIndex(
warngenLayer, warngenLayer.getPolygon().getCoordinates(),
@ -549,7 +547,6 @@ public class WarngenUIManager extends InputAdapter {
return;
}
warngenLayer.initRemovedGids();
Coordinate c = new Coordinate(lastMouseX, lastMouseY);
Polygon poly = warngenLayer.getPolygon();

View file

@ -44,6 +44,7 @@ import com.vividsolutions.jts.geom.Polygon;
* 12/06/2012 DR 15559 Qinglu Lin Added computeSlope(), computeCoordinate(),
* and adjustPolygon().
* Feb 15, 2013 1624 jsanchez Fix NullPointerException in removeDuplicateCoordinate.
* 03/28/2013 DR 15974 D. Friedman Track marked areas outside polygon.
*
* </pre>
*
@ -77,6 +78,8 @@ public class WarngenUIState {
public FollowupData followupData = null;
private Set<String> fipsOutsidePolygon = null;
/**
* Get the warning area in lat/lon projection
*
@ -326,6 +329,14 @@ public class WarngenUIState {
this.warningPolygon = removeDuplicateCoordinate(warningPolygon);
}
public Set<String> getFipsOutsidePolygon() {
return fipsOutsidePolygon;
}
public void setFipsOutsidePolygon(Set<String> gidsOutsidePolygon) {
this.fipsOutsidePolygon = gidsOutsidePolygon;
}
public void clear() {
warningPolygon = null;
clear2();
@ -344,6 +355,7 @@ public class WarngenUIState {
warningArea = null;
markedWarningArea = null;
markedWarningPolygon = null;
fipsOutsidePolygon = null;
}
/**

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -34,7 +34,6 @@ import java.util.regex.Pattern;
import com.raytheon.edex.plugin.gfe.config.IFPServerConfig;
import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager;
import com.raytheon.edex.plugin.gfe.db.dao.GFEDao;
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
import com.raytheon.edex.plugin.gfe.server.GridParmManager;
import com.raytheon.edex.plugin.gfe.server.database.D2DGridDatabase;
@ -47,6 +46,7 @@ import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
import com.raytheon.uf.common.dataplugin.gfe.exception.GfeException;
import com.raytheon.uf.common.dataplugin.gfe.server.message.ServerResponse;
import com.raytheon.uf.common.dataplugin.gfe.server.notify.GridUpdateNotification;
import com.raytheon.uf.common.message.WsId;
import com.raytheon.uf.common.status.IUFStatusHandler;
@ -70,6 +70,8 @@ import com.raytheon.uf.edex.site.SiteAwareRegistry;
* D2DParmIdCache toGfeIngestNotificationFilter.
* Added code to match wind components and send
* GridUpdateNotifications.
* Mar 20, 2013 #1774 randerso Changde to use GFDD2DDao
*
* </pre>
*
* @author bphillip
@ -308,7 +310,6 @@ public class D2DParmIdCache {
"Building D2DParmIdCache for " + siteID + "...");
IFPServerConfig config = IFPServerConfigManager
.getServerConfig(siteID);
GFEDao dao = new GFEDao();
Set<ParmID> parmIds = new HashSet<ParmID>();
long start = System.currentTimeMillis();
List<String> d2dModels = config.getD2dModels();
@ -318,8 +319,8 @@ public class D2DParmIdCache {
if ((d2dModelName != null) && (gfeModel != null)) {
List<DatabaseID> dbIds = null;
try {
dbIds = dao.getD2DDatabaseIdsFromDb(d2dModelName,
gfeModel, siteID);
dbIds = D2DGridDatabase.getD2DDatabaseIdsFromDb(config,
d2dModelName);
} catch (DataAccessLayerException e) {
throw new PluginException(
"Unable to get D2D Database Ids from database!",
@ -333,9 +334,14 @@ public class D2DParmIdCache {
for (int i = 0; i < versions; i++) {
try {
parmIds.addAll(dao.getD2DParmIdsFromDb(
d2dModelName, dbIds.get(i)));
} catch (DataAccessLayerException e) {
D2DGridDatabase db = (D2DGridDatabase) GridParmManager
.getDb(dbIds.get(i));
ServerResponse<List<ParmID>> sr = db
.getParmList();
if (sr.isOkay()) {
parmIds.addAll(sr.getPayload());
}
} catch (GfeException e) {
throw new PluginException(
"Error adding parmIds to D2DParmIdCache!!",
e);

View file

@ -34,13 +34,13 @@ import com.google.common.util.concurrent.MoreExecutors;
import com.raytheon.edex.plugin.gfe.cache.d2dparms.D2DParmIdCache;
import com.raytheon.edex.plugin.gfe.cache.gridlocations.GridLocationCache;
import com.raytheon.edex.plugin.gfe.cache.ifpparms.IFPParmIdCache;
import com.raytheon.edex.plugin.gfe.db.dao.GFEDao;
import com.raytheon.edex.plugin.gfe.db.dao.IscSendRecordDao;
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
import com.raytheon.edex.plugin.gfe.exception.GfeMissingConfigurationException;
import com.raytheon.edex.plugin.gfe.isc.IRTManager;
import com.raytheon.edex.plugin.gfe.reference.MapManager;
import com.raytheon.edex.plugin.gfe.server.GridParmManager;
import com.raytheon.edex.plugin.gfe.server.database.D2DGridDatabase;
import com.raytheon.edex.plugin.gfe.server.database.D2DSatDatabaseManager;
import com.raytheon.edex.plugin.gfe.server.database.GridDatabase;
import com.raytheon.edex.plugin.gfe.server.database.NetCDFDatabaseManager;
@ -85,6 +85,7 @@ import com.raytheon.uf.edex.site.notify.SendSiteActivationNotifications;
* Feb 15, 2013 1638 mschenke Moved sending of site notification messages to edex plugin
* Feb 28, 2013 #1447 dgilling Enable active table fetching on site
* activation.
* Mar 20, 2013 #1774 randerso Changed to use GFED2DDao
*
* </pre>
*
@ -426,7 +427,6 @@ public class GFESiteActivation implements ISiteActivationListener {
if (LockState.SUCCESSFUL.equals(ct.getLockState())) {
boolean clearTime = false;
try {
GFEDao dao = new GFEDao();
List<String> d2dModels = configRef.getD2dModels();
List<List<String>> idsByVersion = new ArrayList<List<String>>(
5);
@ -441,10 +441,9 @@ public class GFESiteActivation implements ISiteActivationListener {
.desiredDbVersions(new DatabaseID(
siteID, DataType.GRID, "",
gfeModel));
List<DatabaseID> dbIds = dao
.getD2DDatabaseIdsFromDb(
d2dModelName, gfeModel,
siteID, versions);
List<DatabaseID> dbIds = D2DGridDatabase
.getD2DDatabaseIdsFromDb(configRef,
d2dModelName, versions);
while (versions > idsByVersion.size()) {
idsByVersion.add(new ArrayList<String>(

View file

@ -0,0 +1,419 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.edex.plugin.gfe.db.dao;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import com.raytheon.edex.plugin.gfe.config.IFPServerConfig;
import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager;
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
import com.raytheon.edex.plugin.gfe.util.GridTranslator;
import com.raytheon.uf.common.comm.CommunicationException;
import com.raytheon.uf.common.dataplugin.PluginException;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
import com.raytheon.uf.common.dataplugin.grid.GridConstants;
import com.raytheon.uf.common.dataplugin.grid.GridInfoConstants;
import com.raytheon.uf.common.dataplugin.grid.GridRecord;
import com.raytheon.uf.common.dataplugin.level.Level;
import com.raytheon.uf.common.dataplugin.level.LevelFactory;
import com.raytheon.uf.common.parameter.mapping.ParameterMapper;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.util.mapping.MultipleMappingException;
import com.raytheon.uf.edex.database.DataAccessLayerException;
import com.raytheon.uf.edex.database.query.DatabaseQuery;
import com.raytheon.uf.edex.plugin.grid.dao.GridDao;
/**
* Data access object for manipulating GFE Records
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 03/20/13 #1774 randerso Refactored out of GFEDao
*
* </pre>
*
* @author randerso
* @version 1.0
*/
// **********************************************************************
// TODO: this was moved out of GFEDao and needs to be cleaned up to better
// use the inherited GridDao functionality and hibernate instead of
// SQL/HQL queries. Some parts of the queries could be pushed up to
// GridDao
// **********************************************************************
public class GFED2DDao extends GridDao {
private static final String FCST_TIME = "dataTime.fcstTime";
private static final String REF_TIME = "dataTime.refTime";
// hibernate query to find grid info record for the given datasetId and
// parameter
private static final String SQL_D2D_GRID_PARM_QUERY = "select parameter_abbreviation, id "
+ "FROM grid_info WHERE "
+ GridInfoConstants.DATASET_ID
+ " = :"
+ GridInfoConstants.DATASET_ID
+ " AND "
+ "level_id = :level_id AND "
+ "(lower(parameter_abbreviation) = :abbrev OR lower(parameter_abbreviation) like :hourAbbrev)";
// hibernate query to find the times for the GridRecord for the given
// info.id, id returned to allow easy lookup of the record associated with
// the time
private static final String HQL_D2D_GRID_TIME_QUERY = "select dataTime.fcstTime, id from GridRecord "
+ "where "
+ GridConstants.INFO_ID
+ " = :info_id AND dataTime.refTime = :refTime order by dataTime.fcstTime";
private static final Pattern WIND_PATTERN = Pattern.compile("wind");
public GFED2DDao() throws PluginException {
super();
}
/**
* Retrieves a list of available forecast times
*
* @param dbId
* The database ID to get the times for
* @return The list of forecast times associated with the specified
* DatabaseID
* @throws DataAccessLayerException
* If errors occur while querying the metadata database
*/
public List<Integer> getD2DForecastTimes(DatabaseID dbId)
throws DataAccessLayerException {
DatabaseQuery query = new DatabaseQuery(GridRecord.class.getName());
query.addDistinctParameter(FCST_TIME);
try {
IFPServerConfig config = IFPServerConfigManager
.getServerConfig(dbId.getSiteId());
query.addQueryParam(GridConstants.DATASET_ID,
config.d2dModelNameMapping(dbId.getModelName()));
} catch (GfeConfigurationException e) {
throw new DataAccessLayerException(
"Error occurred looking up model name mapping", e);
}
query.addQueryParam(REF_TIME, dbId.getModelTimeAsDate());
query.addOrder(FCST_TIME, true);
@SuppressWarnings("unchecked")
List<Integer> vals = (List<Integer>) this.queryByCriteria(query);
return vals;
}
/**
* Retrieves a GridRecord from the grib metadata database based on a ParmID,
* TimeRange, and GridParmInfo.
*
* @param id
* The parmID of the desired GridRecord
* @param forecastTime
* The foreCast time of the desired GridRecord, null for any
* record
* @param info
* The GridParmInfo for the requested d2d grid.
* @return The GridRecord from the grib metadata database
* @throws DataAccessLayerException
* If errors occur while querying the metadata database
*/
public GridRecord getD2DGrid(ParmID id, Integer forecastTime,
GridParmInfo info) throws DataAccessLayerException {
Session s = null;
try {
s = getHibernateTemplate().getSessionFactory().openSession();
// TODO: clean up so we only make one db query
SortedMap<Integer, Integer> rawTimes = queryByD2DParmId(id, s);
// if forecastTime is null just pick one,
// this is for static data since all times are the same
if (forecastTime == null) {
forecastTime = rawTimes.keySet().iterator().next();
}
GridRecord retVal = (GridRecord) s.get(GridRecord.class,
rawTimes.get(forecastTime));
retVal.setPluginName(GridConstants.GRID);
return retVal;
} finally {
if (s != null) {
try {
s.close();
} catch (Exception e) {
statusHandler.error(
"Error occurred closing database session", e);
}
}
}
}
/**
* Gets a SortedMap of DataTime and GridRecord ids from the grib metadata
* database which match the given ParmID. Session passed to allow reuse
* across multiple calls.
*
* @param id
* The ParmID to search with
* @param s
* The database session to use
* @return The list of GridRecords from the grib metadata database which
* match the given ParmID
* @throws DataAccessLayerException
* If errors occur while querying the metadata database
*/
public SortedMap<Integer, Integer> queryByD2DParmId(ParmID id, Session s)
throws DataAccessLayerException {
String levelName = GridTranslator.getLevelName(id.getParmLevel());
double[] levelValues = GridTranslator.getLevelValue(id.getParmLevel());
boolean levelOnePresent = (levelValues[0] != Level
.getInvalidLevelValue());
boolean levelTwoPresent = (levelValues[1] != Level
.getInvalidLevelValue());
Level level = null;
// to have a level 2, must have a level one
try {
if (levelOnePresent && levelTwoPresent) {
level = LevelFactory.getInstance().getLevel(levelName,
levelValues[0], levelValues[1]);
} else if (levelOnePresent) {
level = LevelFactory.getInstance().getLevel(levelName,
levelValues[0]);
} else {
level = LevelFactory.getInstance().getLevel(levelName, 0.0);
}
} catch (CommunicationException e) {
logger.error(e.getLocalizedMessage(), e);
}
if (level == null) {
logger.warn("Unable to query D2D parms, ParmID " + id
+ " does not map to a level");
return new TreeMap<Integer, Integer>();
}
SQLQuery modelQuery = s.createSQLQuery(SQL_D2D_GRID_PARM_QUERY);
modelQuery.setLong("level_id", level.getId());
DatabaseID dbId = id.getDbId();
try {
IFPServerConfig config = IFPServerConfigManager
.getServerConfig(dbId.getSiteId());
modelQuery.setString(GridInfoConstants.DATASET_ID,
config.d2dModelNameMapping(dbId.getModelName()));
} catch (GfeConfigurationException e) {
throw new DataAccessLayerException(
"Error occurred looking up model name mapping", e);
}
String abbreviation = null;
try {
abbreviation = ParameterMapper.getInstance().lookupBaseName(
id.getParmName(), "gfeParamName");
} catch (MultipleMappingException e) {
statusHandler.handle(Priority.WARN, e.getLocalizedMessage(), e);
abbreviation = e.getArbitraryMapping();
}
abbreviation = abbreviation.toLowerCase();
modelQuery.setString("abbrev", abbreviation);
modelQuery.setString("hourAbbrev", abbreviation + "%hr");
@SuppressWarnings("unchecked")
List<Object[]> results = modelQuery.list();
Integer modelId = null;
if (results.size() == 0) {
return new TreeMap<Integer, Integer>();
} else if (results.size() > 1) {
// hours matched, take hour with least number that matches exact
// param
Pattern p = Pattern.compile("^" + abbreviation + "(\\d+)hr$");
int lowestHr = -1;
for (Object[] rows : results) {
String param = ((String) rows[0]).toLowerCase();
if (param.equals(abbreviation) && (lowestHr < 0)) {
modelId = (Integer) rows[1];
} else {
Matcher matcher = p.matcher(param);
if (matcher.matches()) {
int hr = Integer.parseInt(matcher.group(1));
if ((lowestHr < 0) || (hr < lowestHr)) {
modelId = (Integer) rows[1];
lowestHr = hr;
}
}
}
}
} else {
modelId = (Integer) (results.get(0))[1];
}
Query timeQuery = s.createQuery(HQL_D2D_GRID_TIME_QUERY);
timeQuery.setInteger("info_id", modelId);
timeQuery.setParameter("refTime", dbId.getModelTimeAsDate());
@SuppressWarnings("unchecked")
List<Object[]> timeResults = timeQuery.list();
if (timeResults.isEmpty()) {
return new TreeMap<Integer, Integer>();
}
SortedMap<Integer, Integer> dataTimes = new TreeMap<Integer, Integer>();
for (Object[] rows : timeResults) {
dataTimes.put((Integer) rows[0], (Integer) rows[1]);
}
return dataTimes;
}
/**
* Retrieve the available Forecast Hours by D2D parm id.
*
* @param id
* @return the list of forecast hours
* @throws DataAccessLayerException
*/
public List<Integer> queryFcstHourByD2DParmId(ParmID id)
throws DataAccessLayerException {
List<Integer> timeList = new ArrayList<Integer>();
Session s = null;
try {
s = getHibernateTemplate().getSessionFactory().openSession();
if (id.getParmName().equalsIgnoreCase("wind")) {
String idString = id.toString();
Matcher idWindMatcher = WIND_PATTERN.matcher(idString);
ParmID uWindId = new ParmID(idWindMatcher.replaceAll("uW"));
SortedMap<Integer, Integer> results = queryByD2DParmId(uWindId,
s);
List<Integer> uTimeList = new ArrayList<Integer>(results.size());
for (Integer o : results.keySet()) {
uTimeList.add(o);
}
ParmID vWindId = new ParmID(idWindMatcher.replaceAll("vW"));
results = queryByD2DParmId(vWindId, s);
Set<Integer> vTimeList = new HashSet<Integer>(results.size(), 1);
for (Integer o : results.keySet()) {
vTimeList.add(o);
}
for (Integer tr : uTimeList) {
if (vTimeList.contains(tr)) {
timeList.add(tr);
}
}
if (!timeList.isEmpty()) {
return timeList;
}
ParmID sWindId = new ParmID(idWindMatcher.replaceAll("ws"));
results = queryByD2DParmId(sWindId, s);
List<Integer> sTimeList = new ArrayList<Integer>(results.size());
for (Integer o : results.keySet()) {
sTimeList.add(o);
}
ParmID dWindId = new ParmID(idWindMatcher.replaceAll("wd"));
results = queryByD2DParmId(dWindId, s);
Set<Integer> dTimeList = new HashSet<Integer>(results.size(), 1);
for (Integer o : results.keySet()) {
dTimeList.add(o);
}
for (Integer tr : sTimeList) {
if (dTimeList.contains(tr)) {
timeList.add(tr);
}
}
} else {
SortedMap<Integer, Integer> results = queryByD2DParmId(id, s);
for (Integer o : results.keySet()) {
timeList.add(o);
}
}
} finally {
if (s != null) {
try {
s.close();
} catch (Exception e) {
statusHandler.error(
"Error occurred closing database session", e);
}
}
}
return timeList;
}
/**
* Retrieves model run times for the n most recent model runs of a given
* d2dModelName
*
* @param d2dModelName
* @param maxRecords
* @return
* @throws DataAccessLayerException
*/
public List<Date> getD2DModelRunTimes(String d2dModelName, int maxRecords)
throws DataAccessLayerException {
DatabaseQuery query = new DatabaseQuery(GridRecord.class.getName());
query.addDistinctParameter(REF_TIME);
query.addQueryParam(GridConstants.DATASET_ID, d2dModelName);
query.addOrder(REF_TIME, false);
if (maxRecords > 0) {
query.setMaxResults(maxRecords);
}
List<?> result = this.queryByCriteria(query);
List<Date> inventory = new ArrayList<Date>(result.size());
for (Object obj : result) {
// convert returned "Dates" (actually java.sql.TimeStamps) to actual
// java.util.Dates so equals comparisons work correctly
Date date = new Date(((Date) obj).getTime());
inventory.add(date);
}
return inventory;
}
}

View file

@ -27,18 +27,13 @@ import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.DetachedCriteria;
@ -49,44 +44,27 @@ import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import com.raytheon.edex.db.dao.DefaultPluginDao;
import com.raytheon.edex.plugin.gfe.config.GFESiteActivation;
import com.raytheon.edex.plugin.gfe.config.IFPServerConfig;
import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager;
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
import com.raytheon.edex.plugin.gfe.server.GridParmManager;
import com.raytheon.edex.plugin.gfe.server.database.D2DGridDatabase;
import com.raytheon.edex.plugin.gfe.server.database.GridDatabase;
import com.raytheon.edex.plugin.gfe.util.GridTranslator;
import com.raytheon.edex.plugin.gfe.util.SendNotifications;
import com.raytheon.uf.common.comm.CommunicationException;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataplugin.PluginException;
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID.DataType;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
import com.raytheon.uf.common.dataplugin.gfe.exception.GfeException;
import com.raytheon.uf.common.dataplugin.gfe.server.notify.GridUpdateNotification;
import com.raytheon.uf.common.dataplugin.gfe.server.notify.LockNotification;
import com.raytheon.uf.common.dataplugin.gfe.util.GfeUtil;
import com.raytheon.uf.common.dataplugin.grid.GridConstants;
import com.raytheon.uf.common.dataplugin.grid.GridInfoConstants;
import com.raytheon.uf.common.dataplugin.grid.GridRecord;
import com.raytheon.uf.common.dataplugin.level.Level;
import com.raytheon.uf.common.dataplugin.level.LevelFactory;
import com.raytheon.uf.common.dataplugin.persist.IPersistable;
import com.raytheon.uf.common.dataplugin.persist.PersistableDataObject;
import com.raytheon.uf.common.dataquery.db.QueryResult;
import com.raytheon.uf.common.datastorage.DataStoreFactory;
import com.raytheon.uf.common.datastorage.IDataStore;
import com.raytheon.uf.common.parameter.mapping.ParameterMapper;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.common.time.TimeRange;
import com.raytheon.uf.common.time.util.TimeUtil;
import com.raytheon.uf.common.util.Pair;
import com.raytheon.uf.common.util.mapping.MultipleMappingException;
import com.raytheon.uf.edex.database.DataAccessLayerException;
import com.raytheon.uf.edex.database.purge.PurgeLogger;
import com.raytheon.uf.edex.database.query.DatabaseQuery;
@ -112,7 +90,8 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery;
* 01/21/12 #1504 randerso Back ported change to use ParameterMapper into 13.1.2
* 02/10/13 #1603 randerso Eliminated unnecessary conversion from lists to arrays
* 02/12/13 #1608 randerso Changed to use explicit deletes for groups and datasets
* 03/15/13 #1795 njensen Added updatePublishTime()
* 03/15/13 #1795 njensen Added updatePublishTime()
* 03/21/13 #1774 randerso Moved D2D routines into {@link com.raytheon.edex.plugin.gfe.db.dao.GFED2DDao}
*
* </pre>
*
@ -120,25 +99,6 @@ import com.raytheon.uf.edex.database.query.DatabaseQuery;
* @version 1.0
*/
public class GFEDao extends DefaultPluginDao {
// hibernate query to find grid info record for the given datasetId and
// parameter
private String SQL_D2D_GRID_PARM_QUERY = "select parameter_abbreviation, id "
+ "FROM grid_info WHERE "
+ GridInfoConstants.DATASET_ID
+ " = :"
+ GridInfoConstants.DATASET_ID
+ " AND "
+ "level_id = :level_id AND "
+ "(lower(parameter_abbreviation) = :abbrev OR lower(parameter_abbreviation) like :hourAbbrev)";
// hibernate query to find the times for the GridRecord for the given
// info.id, id returned to allow easy lookup of the record associated with
// the time
private static final String HQL_D2D_GRID_TIME_QUERY = "select dataTime, id from GridRecord "
+ "where "
+ GridConstants.INFO_ID
+ " = :info_id AND dataTime.refTime = :refTime order by dataTime.fcstTime";
private static final Pattern WIND_PATTERN = Pattern.compile("wind");
public GFEDao() throws PluginException {
@ -596,348 +556,6 @@ public class GFEDao extends DefaultPluginDao {
return history;
}
/**
* Retrieves a list of valid times for a specified ParmID from the grib
* metadata database. The valid time is constructed by adding the forecast
* time to the reference time.
*
* @param id
* The parmID to get the times for
* @return The list of times associated with the specified ParmID
* @throws DataAccessLayerException
* If errors occur while querying the metadata database
*/
public List<TimeRange> getD2DTimes(ParmID id)
throws DataAccessLayerException {
return queryTimeByD2DParmId(id);
}
/**
* Retrieves a list of available forecast times
*
* @param dbId
* The database ID to get the times for
* @return The list of forecast times associated with the specified
* DatabaseID
* @throws DataAccessLayerException
* If errors occur while querying the metadata database
*/
@SuppressWarnings("unchecked")
public List<Integer> getD2DForecastTimes(DatabaseID dbId)
throws DataAccessLayerException {
DatabaseQuery query = new DatabaseQuery(GridRecord.class.getName());
query.addDistinctParameter("dataTime.fcstTime");
try {
IFPServerConfig config = IFPServerConfigManager
.getServerConfig(dbId.getSiteId());
query.addQueryParam(GridConstants.DATASET_ID,
config.d2dModelNameMapping(dbId.getModelName()));
} catch (GfeConfigurationException e) {
throw new DataAccessLayerException(
"Error occurred looking up model name mapping", e);
}
query.addQueryParam("dataTime.refTime", dbId.getModelTimeAsDate());
query.addOrder("dataTime.fcstTime", true);
List<?> vals = this.queryByCriteria(query);
return (List<Integer>) vals;
}
/**
* Retrieves a GridRecord from the grib metadata database based on a ParmID,
* TimeRange, and GridParmInfo.
*
* @param id
* The parmID of the desired GridRecord
* @param timeRange
* The timeRange of the desired GridRecord
* @param info
* The GridParmInfo for the requested d2d grid.
* @return The GridRecord from the grib metadata database
* @throws DataAccessLayerException
* If errors occur while querying the metadata database
*/
public GridRecord getD2DGrid(ParmID id, TimeRange timeRange,
GridParmInfo info) throws DataAccessLayerException {
Session s = null;
try {
s = getHibernateTemplate().getSessionFactory().openSession();
// TODO: clean up so we only make one db query
SortedMap<DataTime, Integer> rawTimes = queryByD2DParmId(id, s);
List<TimeRange> gribTimes = new ArrayList<TimeRange>();
for (DataTime dt : rawTimes.keySet()) {
gribTimes.add(dt.getValidPeriod());
}
try {
if (isMos(id)) {
for (Map.Entry<DataTime, Integer> timeEntry : rawTimes
.entrySet()) {
TimeRange gribTime = timeEntry.getKey()
.getValidPeriod();
TimeRange time = info.getTimeConstraints()
.constraintTime(gribTime.getEnd());
if (timeRange.getEnd().equals(time.getEnd())
|| !info.getTimeConstraints().anyConstraints()) {
GridRecord retVal = (GridRecord) s.get(
GridRecord.class, timeEntry.getValue());
retVal.setPluginName(GridConstants.GRID);
return retVal;
}
}
} else if (D2DGridDatabase.isNonAccumDuration(id, gribTimes)) {
for (Map.Entry<DataTime, Integer> timeEntry : rawTimes
.entrySet()) {
TimeRange gribTime = timeEntry.getKey()
.getValidPeriod();
if (timeRange.getStart().equals(gribTime.getEnd())
|| timeRange.equals(gribTime)) {
GridRecord retVal = (GridRecord) s.get(
GridRecord.class, timeEntry.getValue());
retVal.setPluginName(GridConstants.GRID);
return retVal;
}
}
} else {
for (Map.Entry<DataTime, Integer> timeEntry : rawTimes
.entrySet()) {
TimeRange gribTime = timeEntry.getKey()
.getValidPeriod();
TimeRange time = info.getTimeConstraints()
.constraintTime(gribTime.getStart());
if ((timeRange.getStart().equals(time.getStart()) || !info
.getTimeConstraints().anyConstraints())) {
GridRecord retVal = (GridRecord) s.get(
GridRecord.class, timeEntry.getValue());
retVal.setPluginName(GridConstants.GRID);
return retVal;
}
}
}
} catch (GfeConfigurationException e) {
throw new DataAccessLayerException(
"Error getting configuration for "
+ id.getDbId().getSiteId(), e);
}
} finally {
if (s != null) {
try {
s.close();
} catch (Exception e) {
statusHandler.error(
"Error occurred closing database session", e);
}
}
}
return null;
}
/**
* Gets a SortedMap of DataTime and GridRecord ids from the grib metadata
* database which match the given ParmID. Session passed to allow reuse
* across multiple calls.
*
* @param id
* The ParmID to search with
* @param s
* The database session to use
* @return The list of GridRecords from the grib metadata database which
* match the given ParmID
* @throws DataAccessLayerException
* If errors occur while querying the metadata database
*/
@SuppressWarnings("unchecked")
public SortedMap<DataTime, Integer> queryByD2DParmId(ParmID id, Session s)
throws DataAccessLayerException {
String levelName = GridTranslator.getLevelName(id.getParmLevel());
double[] levelValues = GridTranslator.getLevelValue(id.getParmLevel());
boolean levelOnePresent = (levelValues[0] != Level
.getInvalidLevelValue());
boolean levelTwoPresent = (levelValues[1] != Level
.getInvalidLevelValue());
Level level = null;
// to have a level 2, must have a level one
try {
if (levelOnePresent && levelTwoPresent) {
level = LevelFactory.getInstance().getLevel(levelName,
levelValues[0], levelValues[1]);
} else if (levelOnePresent) {
level = LevelFactory.getInstance().getLevel(levelName,
levelValues[0]);
} else {
level = LevelFactory.getInstance().getLevel(levelName, 0.0);
}
} catch (CommunicationException e) {
logger.error(e.getLocalizedMessage(), e);
}
if (level == null) {
logger.warn("Unable to query D2D parms, ParmID " + id
+ " does not map to a level");
return new TreeMap<DataTime, Integer>();
}
SQLQuery modelQuery = s.createSQLQuery(SQL_D2D_GRID_PARM_QUERY);
modelQuery.setLong("level_id", level.getId());
DatabaseID dbId = id.getDbId();
try {
IFPServerConfig config = IFPServerConfigManager
.getServerConfig(dbId.getSiteId());
modelQuery.setString(GridInfoConstants.DATASET_ID,
config.d2dModelNameMapping(dbId.getModelName()));
} catch (GfeConfigurationException e) {
throw new DataAccessLayerException(
"Error occurred looking up model name mapping", e);
}
String abbreviation = null;
try {
abbreviation = ParameterMapper.getInstance().lookupBaseName(
id.getParmName(), "gfeParamName");
} catch (MultipleMappingException e) {
statusHandler.handle(Priority.WARN, e.getLocalizedMessage(), e);
abbreviation = e.getArbitraryMapping();
}
abbreviation = abbreviation.toLowerCase();
modelQuery.setString("abbrev", abbreviation);
modelQuery.setString("hourAbbrev", abbreviation + "%hr");
List<?> results = modelQuery.list();
Integer modelId = null;
if (results.size() == 0) {
return new TreeMap<DataTime, Integer>();
} else if (results.size() > 1) {
// hours matched, take hour with least number that matches exact
// param
Pattern p = Pattern.compile("^" + abbreviation + "(\\d+)hr$");
int lowestHr = -1;
for (Object[] rows : (List<Object[]>) results) {
String param = ((String) rows[0]).toLowerCase();
if (param.equals(abbreviation) && (lowestHr < 0)) {
modelId = (Integer) rows[1];
} else {
Matcher matcher = p.matcher(param);
if (matcher.matches()) {
int hr = Integer.parseInt(matcher.group(1));
if ((lowestHr < 0) || (hr < lowestHr)) {
modelId = (Integer) rows[1];
lowestHr = hr;
}
}
}
}
} else {
modelId = (Integer) ((Object[]) results.get(0))[1];
}
Query timeQuery = s.createQuery(HQL_D2D_GRID_TIME_QUERY);
timeQuery.setInteger("info_id", modelId);
timeQuery.setParameter("refTime", dbId.getModelTimeAsDate());
List<Object[]> timeResults = timeQuery.list();
if (timeResults.isEmpty()) {
return new TreeMap<DataTime, Integer>();
}
SortedMap<DataTime, Integer> dataTimes = new TreeMap<DataTime, Integer>();
for (Object[] rows : timeResults) {
dataTimes.put((DataTime) rows[0], (Integer) rows[1]);
}
return dataTimes;
}
public List<TimeRange> queryTimeByD2DParmId(ParmID id)
throws DataAccessLayerException {
List<TimeRange> timeList = new ArrayList<TimeRange>();
Session s = null;
try {
s = getHibernateTemplate().getSessionFactory().openSession();
if (id.getParmName().equalsIgnoreCase("wind")) {
String idString = id.toString();
Matcher idWindMatcher = WIND_PATTERN.matcher(idString);
ParmID uWindId = new ParmID(idWindMatcher.replaceAll("uW"));
SortedMap<DataTime, Integer> results = queryByD2DParmId(
uWindId, s);
List<TimeRange> uTimeList = new ArrayList<TimeRange>(
results.size());
for (DataTime o : results.keySet()) {
uTimeList.add(new TimeRange(o.getValidPeriod().getStart(),
3600 * 1000));
}
ParmID vWindId = new ParmID(idWindMatcher.replaceAll("vW"));
results = queryByD2DParmId(vWindId, s);
Set<TimeRange> vTimeList = new HashSet<TimeRange>(
results.size(), 1);
for (DataTime o : results.keySet()) {
vTimeList.add(new TimeRange(o.getValidPeriod().getStart(),
3600 * 1000));
}
for (TimeRange tr : uTimeList) {
if (vTimeList.contains(tr)) {
timeList.add(new TimeRange(tr.getStart(), tr.getStart()));
}
}
if (!timeList.isEmpty()) {
return timeList;
}
ParmID sWindId = new ParmID(idWindMatcher.replaceAll("ws"));
results = queryByD2DParmId(sWindId, s);
List<TimeRange> sTimeList = new ArrayList<TimeRange>(
results.size());
for (DataTime o : results.keySet()) {
sTimeList.add(new TimeRange(o.getValidPeriod().getStart(),
3600 * 1000));
}
ParmID dWindId = new ParmID(idWindMatcher.replaceAll("wd"));
results = queryByD2DParmId(dWindId, s);
Set<TimeRange> dTimeList = new HashSet<TimeRange>(
results.size(), 1);
for (DataTime o : results.keySet()) {
dTimeList.add(new TimeRange(o.getValidPeriod().getStart(),
3600 * 1000));
}
for (TimeRange tr : sTimeList) {
if (dTimeList.contains(tr)) {
timeList.add(new TimeRange(tr.getStart(), tr.getStart()));
}
}
} else {
SortedMap<DataTime, Integer> results = queryByD2DParmId(id, s);
if (isMos(id)) {
for (DataTime o : results.keySet()) {
timeList.add(new TimeRange(o.getValidPeriod().getEnd(),
o.getValidPeriod().getDuration()));
}
} else {
for (DataTime o : results.keySet()) {
timeList.add(o.getValidPeriod());
}
}
}
} finally {
if (s != null) {
try {
s.close();
} catch (Exception e) {
statusHandler.error(
"Error occurred closing database session", e);
}
}
}
return timeList;
}
public void purgeGFEGrids(final DatabaseID dbId) {
txTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
@ -959,107 +577,6 @@ public class GFEDao extends DefaultPluginDao {
});
}
public List<DatabaseID> getD2DDatabaseIdsFromDb(String d2dModelName,
String gfeModel, String siteID) throws DataAccessLayerException {
return getD2DDatabaseIdsFromDb(d2dModelName, gfeModel, siteID, -1);
}
public List<DatabaseID> getD2DDatabaseIdsFromDb(String d2dModelName,
String gfeModel, String siteID, int maxRecords)
throws DataAccessLayerException {
List<DatabaseID> dbInventory = new ArrayList<DatabaseID>();
DatabaseQuery query = new DatabaseQuery(GridRecord.class.getName());
query.addDistinctParameter("dataTime.refTime");
query.addQueryParam(GridConstants.DATASET_ID, d2dModelName);
query.addOrder("dataTime.refTime", false);
if (maxRecords > 0) {
query.setMaxResults(maxRecords);
}
List<?> result = this.queryByCriteria(query);
for (Object obj : result) {
DatabaseID dbId = null;
dbId = new DatabaseID(siteID, DataType.GRID, "D2D", gfeModel,
(Date) obj);
try {
GridDatabase db = GridParmManager.getDb(dbId);
if ((db != null) && !dbInventory.contains(dbId)) {
dbInventory.add(dbId);
}
} catch (GfeException e) {
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
e);
}
}
return dbInventory;
}
/**
* Retrieves the latest (or newest) model run for the given site and model
* name.
*
* @param d2dModel
* A GridModel object that contains the D2D model name.
* @param gfeModel
* The GFE model name that corresponds to d2dModel.
* @param siteID
* The site to retrieve the data for.
* @return The DatabaseID of the newest D2D model, or null if no models can
* be found.
* @throws DataAccessLayerException
*/
public DatabaseID getLatestD2DDatabaseIdsFromDb(String d2dModelName,
String gfeModel, String siteID) throws DataAccessLayerException {
List<DatabaseID> dbIds = getD2DDatabaseIdsFromDb(d2dModelName,
gfeModel, siteID, 1);
if (!dbIds.isEmpty()) {
return dbIds.get(0);
} else {
return null;
}
}
public Set<ParmID> getD2DParmIdsFromDb(String d2dModelName, DatabaseID dbId)
throws DataAccessLayerException {
Set<ParmID> parmIds = new HashSet<ParmID>();
DatabaseQuery query = new DatabaseQuery(GridRecord.class.getName());
query.addDistinctParameter(GridConstants.PARAMETER_ABBREVIATION);
query.addDistinctParameter(GridConstants.MASTER_LEVEL_NAME);
query.addDistinctParameter(GridConstants.LEVEL_ONE);
query.addDistinctParameter(GridConstants.LEVEL_TWO);
query.addQueryParam(GridConstants.DATASET_ID, d2dModelName);
query.addQueryParam(
"dataTime.refTime",
TimeUtil.formatDate(dbId.getModelTimeAsDate()).replaceAll("_",
" "));
List<?> result = this.queryByCriteria(query);
for (Object obj : result) {
Object[] objArr = (Object[]) obj;
String levelName = GridTranslator.getShortLevelName(
(String) objArr[1], (Double) objArr[2], (Double) objArr[3]);
if (!levelName.equals(LevelFactory.UNKNOWN_LEVEL)) {
String abbrev = (String) objArr[0];
try {
abbrev = ParameterMapper.getInstance().lookupAlias(abbrev,
"gfeParamName");
} catch (MultipleMappingException e) {
statusHandler.handle(Priority.WARN,
e.getLocalizedMessage(), e);
abbrev = e.getArbitraryMapping();
}
ParmID newParmId = new ParmID(abbrev, dbId, levelName);
parmIds.add(newParmId);
}
}
return parmIds;
}
/**
* Removes GridParmInfo from the HDF5 file and any data associated with that
* info
@ -1136,12 +653,6 @@ public class GFEDao extends DefaultPluginDao {
}
}
public static boolean isMos(ParmID id) {
return id.getDbId().getModelName().equals("MOSGuide")
&& (id.getParmName().startsWith("mxt") || id.getParmName()
.startsWith("mnt"));
}
/**
* Updates the publish times in the database of all provided
* GridDataHistories. Does not alter the publish times in memory.

View file

@ -30,6 +30,8 @@ import com.raytheon.uf.common.dataplugin.gfe.exception.GfeException;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 04/08/08 #875 bphillip Initial Creation
* 03/28/13 #1837 dgilling Implement missing constructors from
* super-class.
*
* </pre>
*
@ -40,6 +42,10 @@ public class GfeConfigurationException extends GfeException {
private static final long serialVersionUID = 1L;
public GfeConfigurationException() {
super();
}
/**
* @param aCause
*/
@ -58,4 +64,7 @@ public class GfeConfigurationException extends GfeException {
super(aCause, anException);
}
public GfeConfigurationException(Throwable anException) {
super(anException);
}
}

View file

@ -0,0 +1,59 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.edex.plugin.gfe.exception;
/**
* Exception thrown when a database table referenced in localMaps.py cannot be
* located in the maps database.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 28, 2013 dgilling Initial creation
*
* </pre>
*
* @author dgilling
* @version 1.0
*/
public class MissingLocalMapsException extends GfeConfigurationException {
private static final long serialVersionUID = 1L;
public MissingLocalMapsException() {
super();
}
public MissingLocalMapsException(String message) {
super(message);
}
public MissingLocalMapsException(String message, Throwable cause) {
super(message, cause);
}
public MissingLocalMapsException(Throwable cause) {
super(cause);
}
}

View file

@ -20,8 +20,11 @@
package com.raytheon.edex.plugin.gfe.paraminfo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@ -31,6 +34,7 @@ import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
import com.raytheon.uf.common.time.TimeRange;
import com.raytheon.uf.common.time.util.TimeUtil;
/**
*
@ -41,7 +45,9 @@ import com.raytheon.uf.common.time.TimeRange;
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jun 24, 2010 #6372 bphillip Initial creation
* Jun 24, 2010 #6372 bphillip Initial creation
* Mar 20, 2013 #1774 randerso Added getParmNames,
* changed getAvailableTimes to match A1
*
* </pre>
*
@ -108,12 +114,21 @@ public class GridParamInfo {
}
public List<TimeRange> getAvailableTimes(Date refTime) {
List<TimeRange> availTimes = new ArrayList<TimeRange>();
for (int i = 1; i < times.size(); i++) {
availTimes.add(new TimeRange(refTime.getTime() + times.get(i - 1)
* 1000, refTime.getTime() + times.get(i) * 1000));
List<TimeRange> availTimes = new ArrayList<TimeRange>(times.size());
for (Integer fcstHour : times) {
availTimes.add(new TimeRange(new Date(refTime.getTime() + fcstHour
* TimeUtil.MILLIS_PER_SECOND), TimeUtil.MILLIS_PER_HOUR));
}
return availTimes;
}
public Collection<String> getParmNames() {
List<ParameterInfo> paramInfoList = this.getGridParamInfo();
Set<String> parmNames = new HashSet<String>();
for (ParameterInfo info : paramInfoList) {
parmNames.add(info.getShort_name());
}
return parmNames;
}
}

View file

@ -56,8 +56,10 @@ import com.raytheon.uf.common.util.mapping.MultipleMappingException;
* Jan 25, 2012 DR 14305 ryu Read site parameterInfo files
* Sep 12, 2012 #1117 dgilling Implement method to retrieve all
* parm names for a given model.
* Feb 15, 2013 1598 bsteffen Make GridParamInfoLookup filter on
* extension.
* Feb 15, 2013 1598 bsteffen Make GridParamInfoLookup filter on
* extension.
* Mar 20, 2013 #1774 randerso Added getModelInfo,
* added Dflt if no levels specified
*
* </pre>
*
@ -94,7 +96,14 @@ public class GridParamInfoLookup {
init();
}
private GridParamInfo getGridParamInfo(String mappedModel) {
/**
* Gets the model information based on the specified model
*
* @param mappedModel
* The model name
* @return The parameter information or null if none found
*/
public GridParamInfo getGridParamInfo(String mappedModel) {
String paramInfoName = null;
try {
paramInfoName = DatasetIdMapper.getInstance().lookupAliasOrNull(
@ -211,5 +220,17 @@ public class GridParamInfoLookup {
"Error unmarshalling grid parameter information", e);
}
}
for (GridParamInfo gridParamInfo : modelParamMap.values()) {
for (String parmName : gridParamInfo.getParmNames()) {
ParameterInfo parameterInfo = gridParamInfo
.getParameterInfo(parmName);
// add Dflt level if no other levels defined
if (parameterInfo.getLevels().isEmpty()) {
parameterInfo.getLevels().add("Dflt");
}
}
}
}
}

View file

@ -43,6 +43,7 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
* Jun 24, 2010 bphillip Initial creation
* Sep 12, 2012 #1117 dgilling Create field to hold list of
* valid levels for each parameter.
* Mar 20, 2013 #1774 randerso Added getMinVal and getMaxVal
*
* </pre>
*
@ -53,6 +54,13 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlAccessorType(XmlAccessType.NONE)
public class ParameterInfo {
// The netCDF convention is MINFLOAT to MAXFLOAT.
// But we can't use it or GFE will attempt to create
// billions and billions of contours.
public static final float MIN_VALUE = 0f;
public static final float MAX_VALUE = 10000f;
@XmlElement
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
private String short_name;
@ -190,6 +198,28 @@ public class ParameterInfo {
this.valid_range = valid_range;
}
/**
* @return the minimum valid value
*/
public float getMinVal() {
float min = MIN_VALUE;
if (valid_range != null && valid_range.length == 2) {
min = valid_range[0];
}
return min;
}
/**
* @return the maximum valid value
*/
public float getMaxVal() {
float min = MAX_VALUE;
if (valid_range != null && valid_range.length == 2) {
min = valid_range[1];
}
return min;
}
/**
* @return the fillValue
*/

View file

@ -46,10 +46,10 @@ import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory2;
import org.opengis.geometry.BoundingBox;
import com.raytheon.edex.plugin.gfe.exception.MissingLocalMapsException;
import com.raytheon.uf.common.dataquery.db.QueryResult;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.edex.core.EDEXUtil;
import com.raytheon.uf.edex.database.tasks.SqlQueryTask;
import com.vividsolutions.jts.geom.Geometry;
@ -68,6 +68,8 @@ import com.vividsolutions.jts.geom.Polygon;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Sep 18, 2012 #1091 randerso Initial creation
* Mar 28, 2013 #1837 dgilling Change error handling in
* getLastUpdated().
*
* </pre>
*
@ -172,11 +174,16 @@ public class DbShapeSource {
/**
* @throws IOException
* @throws MissingLocalMapsException
*
*/
public void open() throws IOException {
public void open() throws IOException, MissingLocalMapsException {
DataStore dataStore = getDataStore();
schema = dataStore.getSchema(this.tableName);
try {
schema = dataStore.getSchema(this.tableName);
} catch (IOException e) {
throw new MissingLocalMapsException(e);
}
shapeField = schema.getGeometryDescriptor().getLocalName();
featureCollection = null;
@ -247,7 +254,8 @@ public class DbShapeSource {
return featureIterator.next();
}
public synchronized ShapeType getShapeType() throws IOException {
public synchronized ShapeType getShapeType() throws IOException,
MissingLocalMapsException {
if (this.type == null) {
boolean closeIt = false;
if (schema == null) {
@ -418,6 +426,9 @@ public class DbShapeSource {
} catch (IOException e) {
statusHandler.error(
"IOException reading " + dbShape.getTableName(), e);
} catch (MissingLocalMapsException e) {
statusHandler.error("Could not locate " + dbShape.getTableName()
+ " in the maps database.", e);
} finally {
try {
if (dbShape != null) {
@ -431,18 +442,17 @@ public class DbShapeSource {
System.out.println("Took " + (System.currentTimeMillis() - t0) + " ms");
}
public Date getLastUpdated() {
Date retVal = new Date();
public Date getLastUpdated() throws MissingLocalMapsException {
String sqlQuery = "SELECT import_time FROM " + SCHEMA_NAME
+ ".map_version WHERE table_name = '" + this.tableName + "';";
try {
SqlQueryTask task = new SqlQueryTask(sqlQuery, DB_NAME);
QueryResult result = task.execute();
retVal = (Date) result.getRowColumnValue(0, 0);
return (Date) result.getRowColumnValue(0, 0);
} catch (Exception e) {
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e);
// statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
// e);
throw new MissingLocalMapsException(e);
}
return retVal;
}
}

View file

@ -47,6 +47,7 @@ import org.opengis.metadata.spatial.PixelOrientation;
import org.opengis.referencing.operation.MathTransform;
import com.raytheon.edex.plugin.gfe.config.IFPServerConfig;
import com.raytheon.edex.plugin.gfe.exception.MissingLocalMapsException;
import com.raytheon.edex.plugin.gfe.reference.DbShapeSource.ShapeType;
import com.raytheon.edex.plugin.gfe.textproducts.AreaDictionaryMaker;
import com.raytheon.edex.plugin.gfe.textproducts.CombinationsFileMaker;
@ -74,6 +75,7 @@ import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.util.FileUtil;
import com.raytheon.uf.common.util.file.FilenameFilters;
import com.raytheon.uf.edex.core.EDEXUtil;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
@ -98,6 +100,9 @@ import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier;
* Oct 13, 2008 #1607 njensen Added genCombinationsFiles()
* Sep 18, 2012 #1091 randerso Changed to use Maps.py and localMaps.py
* Mar 14, 2013 1794 djohnson Consolidate common FilenameFilter implementations.
* Mar 28, 2013 #1837 dgilling Better error reporting if a map table
* from localMaps.py could not be found,
* warnings clean up.
*
* </pre>
*
@ -245,28 +250,21 @@ public class MapManager {
/**
* @param maps
*/
@SuppressWarnings("unused")
/**
* Searches the parent directory of a provided list of shape files to
* determine whether or not they contain a file that is newer than any files
* in a specified directory.
*
* @param maps
* An array of shape files.
* @param directory
* A directory containing the resultant edit areas from the shape
* files.
* @return True, if any file in the parent folder of any of the shape files
* is newer than anything in the specified directory. Else, false.
*/
private boolean updateNeeded(List<DbShapeSource> maps,
final String directory) {
// calc newest file inside maps.directory()
long newestSource = Long.MIN_VALUE;
List<DbShapeSource> failedMaps = new ArrayList<DbShapeSource>();
for (DbShapeSource map : maps) {
newestSource = Math.max(newestSource, map.getLastUpdated()
.getTime());
try {
newestSource = Math.max(newestSource, map.getLastUpdated()
.getTime());
} catch (MissingLocalMapsException e) {
reportMissingLocalMap(map, "retrieving last update time", e);
failedMaps.add(map);
}
}
maps.removeAll(failedMaps);
// Determine time of last modification of Maps.py, serverConfig,
// localConfig, localMaps, and siteConfig.
@ -385,6 +383,10 @@ public class MapManager {
}
makeReferenceData(m);
} catch (MissingLocalMapsException e) {
String error = reportMissingLocalMap(m, "retrieving map data",
e);
_mapErrors.add(error);
} catch (Exception e) {
String error = "********* EDIT AREA GENERATION ERROR - MakeReferenceData *********\n"
+ "Error in generating edit areas, map #"
@ -575,8 +577,8 @@ public class MapManager {
// old one, write a warning to the log.
ReferenceData other = null;
try {
other = (ReferenceData) SerializationUtil
.jaxbUnmarshalFromXmlFile(path);
other = SerializationUtil.jaxbUnmarshalFromXmlFile(
ReferenceData.class, path);
} catch (Exception e) {
statusHandler.error("Error reading edit area file "
+ path.getAbsolutePath(), e);
@ -962,4 +964,23 @@ public class MapManager {
return s;
}
private String reportMissingLocalMap(DbShapeSource missingMap,
String operation, MissingLocalMapsException e) {
String errorLog = "Error in " + operation + " for map named ["
+ missingMap.getDisplayName() + "]: Could not find table ["
+ missingMap.getTableName() + "] in maps database.";
statusHandler.error(errorLog, e);
String errorUser = errorLog
+ " Edit areas for this map will not be generated."
+ " Check site ["
+ _config.getSiteID().get(0)
+ "] localMaps.py configuration and verify all necessary shape files have been imported.";
EDEXUtil.sendMessageAlertViz(Priority.ERROR,
"com.raytheon.edex.plugin.gfe", "GFE", "GFE", errorUser,
errorUser, null);
return errorLog;
}
}

View file

@ -91,6 +91,8 @@ import com.raytheon.uf.edex.database.purge.PurgeLogger;
* smartInit hdf5 data
* 03/07/13 #1773 njensen Logged commitGrid() times
* 03/15/13 #1795 njensen Sped up commitGrid()
* 03/20/2013 #1774 randerso Removed dead method, changed to use new
* D2DGridDatabase constructor
*
* </pre>
*
@ -356,48 +358,6 @@ public class GridParmManager {
return sr;
}
public static ServerResponse<String> getD2DGridData(
List<GetGridRequest> requests) {
ServerResponse<String> retVal = new ServerResponse<String>();
// Get the grid data
ServerResponse<List<IGridSlice>> sr = getGridData(requests);
retVal.addMessages(sr);
if (!sr.isOkay()) {
return retVal;
}
// // Now store it off in a temp location so the client can get to it
// for (IGridSlice slice : sr.getPayload()) {
// try {
// GridDatabase db = getDb(requests.get(0).getParmId().getDbId());
// if (db instanceof D2DGridDatabase) {
// File tempDir = GfeUtil.getTempHDF5Dir(
// GridDatabase.gfeBaseDataDir, requests.get(0)
// .getParmId());
// if (!tempDir.exists()) {
// tempDir.mkdirs();
// }
// db.saveGridToHdf5(slice, GfeUtil.getTempHDF5File(
// GridDatabase.gfeBaseDataDir, requests.get(0)
// .getParmId()), GfeUtil.getHDF5Group(
// requests.get(0).getParmId(), slice.getValidTime()));
// } else {
// retVal
// .addMessage("Cannot save temp grids for non-D2D grid databases.");
// return retVal;
// }
// } catch (GfeException e) {
// sr.addMessage("Unable to get DB: "
// + requests.get(0).getParmId().getDbId());
// return retVal;
// }
// }
return retVal;
}
/**
* * Request to commit data to the official database. The changes are
* returned through the calling argument "changes".
@ -1197,7 +1157,12 @@ public class GridParmManager {
IFPServerConfig serverConfig = IFPServerConfigManager
.getServerConfig(siteId);
try {
db = new D2DGridDatabase(serverConfig, dbId);
// this is still necessary on other JVMs from where
// ingested
String d2dModelName = serverConfig
.d2dModelNameMapping(modelName);
db = new D2DGridDatabase(serverConfig, d2dModelName,
dbId.getModelTimeAsDate());
} catch (Exception e) {
statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage());
@ -1363,10 +1328,9 @@ public class GridParmManager {
private static void createDbNotification(String siteID,
List<DatabaseID> dbs, List<DatabaseID> additions,
List<DatabaseID> deletions) {
DBInvChangeNotification notify = new DBInvChangeNotification(dbs,
additions, deletions, siteID);
if (!additions.isEmpty() || !deletions.isEmpty()) {
DBInvChangeNotification notify = new DBInvChangeNotification(dbs,
additions, deletions, siteID);
SendNotifications.send(notify);
}
}

View file

@ -94,7 +94,6 @@ import com.raytheon.uf.edex.core.dataplugin.PluginRegistry;
import com.raytheon.uf.edex.database.DataAccessLayerException;
import com.raytheon.uf.edex.database.plugin.PluginFactory;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.io.WKTReader;
/**
* GFE Grid database containing IFP Grid data.
@ -115,6 +114,7 @@ import com.vividsolutions.jts.io.WKTReader;
* 02/12/13 #1608 randerso Changed to explicitly call deleteGroups
* 03/07/13 #1737 njensen Logged getGridData times
* 03/15/13 #1795 njensen Added updatePublishTime()
* 03/20/13 #1774 randerso Cleanup code to use proper constructors
*
* </pre>
*
@ -1191,6 +1191,7 @@ public class IFPGridDatabase extends GridDatabase {
"Unable to update grid history!!", e);
}
return sr;
}
/**
@ -1591,77 +1592,79 @@ public class IFPGridDatabase extends GridDatabase {
protected GridParmInfo populateGpi(Map<String, Object> dataAttributes)
throws Exception {
GridParmInfo gpi = new GridParmInfo();
TimeConstraints tc = new TimeConstraints();
GridLocation location = new GridLocation();
ProjectionData pd = new ProjectionData();
pd.setProjectionID((String) dataAttributes
.get("gridLoc.projection.projectionID"));
pd.setProjectionType(ProjectionType.valueOf((String) dataAttributes
.get("gridLoc.projection.projectionType")));
pd.setLatLonLL(new Coordinate((Float) dataAttributes
.get("gridLoc.projection.latLonLL.x"), (Float) dataAttributes
.get("gridLoc.projection.latLonLL.y")));
pd.setLatLonUR(new Coordinate((Float) dataAttributes
.get("gridLoc.projection.latLonUR.x"), (Float) dataAttributes
.get("gridLoc.projection.latLonUR.y")));
pd.setLatLonOrigin(new Coordinate((Float) dataAttributes
.get("gridLoc.projection.latLonOrigin.x"),
(Float) dataAttributes.get("gridLoc.projection.latLonOrigin.y")));
pd.setStdParallelOne((Float) dataAttributes
.get("gridLoc.projection.stdParallelOne"));
pd.setStdParallelTwo((Float) dataAttributes
.get("gridLoc.projection.stdParallelTwo"));
pd.setGridPointLL(new Point((Integer) dataAttributes
.get("gridLoc.projection.gridPointLL.x"),
String projID = (String) dataAttributes
.get("gridLoc.projection.projectionID");
ProjectionType projType = ProjectionType
.valueOf((String) dataAttributes
.get("gridLoc.projection.projectionType"));
Coordinate latLonLL = new Coordinate(
(Float) dataAttributes.get("gridLoc.projection.latLonLL.x"),
(Float) dataAttributes.get("gridLoc.projection.latLonLL.y"));
Coordinate latLonUR = new Coordinate(
(Float) dataAttributes.get("gridLoc.projection.latLonUR.x"),
(Float) dataAttributes.get("gridLoc.projection.latLonUR.y"));
Coordinate latLonOrig = new Coordinate(
(Float) dataAttributes.get("gridLoc.projection.latLonOrigin.x"),
(Float) dataAttributes.get("gridLoc.projection.latLonOrigin.y"));
Float stdPar1 = (Float) dataAttributes
.get("gridLoc.projection.stdParallelOne");
Float stdPar2 = (Float) dataAttributes
.get("gridLoc.projection.stdParallelTwo");
Point gridLL = new Point(
(Integer) dataAttributes
.get("gridLoc.projection.gridPointLL.y")));
pd.setGridPointUR(new Point((Integer) dataAttributes
.get("gridLoc.projection.gridPointUR.x"),
.get("gridLoc.projection.gridPointLL.x"),
(Integer) dataAttributes
.get("gridLoc.projection.gridPointUR.y")));
pd.setLatIntersect((Float) dataAttributes
.get("gridLoc.projection.latIntersect"));
pd.setLonCenter((Float) dataAttributes
.get("gridLoc.projection.lonCenter"));
pd.setLonOrigin((Float) dataAttributes
.get("gridLoc.projection.lonOrigin"));
.get("gridLoc.projection.gridPointLL.y"));
Point gridUR = new Point(
(Integer) dataAttributes
.get("gridLoc.projection.gridPointUR.x"),
(Integer) dataAttributes
.get("gridLoc.projection.gridPointUR.y"));
Float latInt = (Float) dataAttributes
.get("gridLoc.projection.latIntersect");
Float lonCenter = (Float) dataAttributes
.get("gridLoc.projection.lonCenter");
Float lonOrig = (Float) dataAttributes
.get("gridLoc.projection.lonOrigin");
ProjectionData proj = new ProjectionData(projID, projType, latLonLL,
latLonUR, latLonOrig, stdPar1, stdPar2, gridLL, gridUR, latInt,
lonCenter, lonOrig);
location.setSiteId((String) dataAttributes.get("gridLoc.siteID"));
location.setNx((Integer) dataAttributes.get("gridLoc.nx"));
location.setNy((Integer) dataAttributes.get("gridLoc.ny"));
location.setTimeZone((String) dataAttributes.get("gridLoc.timeZone"));
location.setOrigin(new Coordinate((Float) dataAttributes
.get("gridLoc.origin.x"), (Float) dataAttributes
.get("gridLoc.origin.y")));
location.setExtent(new Coordinate((Float) dataAttributes
.get("gridLoc.extent.x"), (Float) dataAttributes
.get("gridLoc.extent.y")));
location.setGeometry(new WKTReader().read((String) dataAttributes
.get("gridLoc.geometry")));
location.setCrsWKT((String) dataAttributes.get("gridLoc.crs"));
location.setProjection(pd);
String id = (String) dataAttributes.get("gridLoc.siteID");
int nx = (Integer) dataAttributes.get("gridLoc.nx");
int ny = (Integer) dataAttributes.get("gridLoc.ny");
Coordinate domainOrigin = new Coordinate(
(Float) dataAttributes.get("gridLoc.origin.x"),
(Float) dataAttributes.get("gridLoc.origin.y"));
Coordinate domainExtent = new Coordinate(
(Float) dataAttributes.get("gridLoc.extent.x"),
(Float) dataAttributes.get("gridLoc.extent.y"));
String timeZone = (String) dataAttributes.get("gridLoc.timeZone");
GridLocation gridLoc = new GridLocation(id, proj, new Point(nx, ny),
domainOrigin, domainExtent, timeZone);
tc.setDuration((Integer) dataAttributes.get("timeConstraints.duration"));
tc.setRepeatInterval((Integer) dataAttributes
.get("timeConstraints.repeatInterval"));
tc.setStartTime((Integer) dataAttributes
.get("timeConstraints.startTime"));
int duration = (Integer) dataAttributes.get("timeConstraints.duration");
int repeatInterval = (Integer) dataAttributes
.get("timeConstraints.repeatInterval");
int startTime = (Integer) dataAttributes
.get("timeConstraints.startTime");
TimeConstraints timeConstraints = new TimeConstraints(duration,
repeatInterval, startTime);
gpi.setParmID(new ParmID((String) dataAttributes.get("parmID")));
gpi.setGridType(GridType.valueOf((String) dataAttributes
.get("gridType")));
gpi.setDescriptiveName((String) dataAttributes.get("descriptiveName"));
gpi.setUnitString((String) dataAttributes.get("unitString"));
gpi.setMaxValue((Float) dataAttributes.get("maxValue"));
gpi.setMinValue((Float) dataAttributes.get("minValue"));
gpi.setPrecision((Integer) dataAttributes.get("precision"));
gpi.setRateParm((Boolean) dataAttributes.get("rateParm"));
gpi.setTimeIndependentParm((Boolean) dataAttributes
.get("timeIndependentParm"));
gpi.setTimeConstraints(tc);
gpi.setGridLoc(location);
ParmID parmId = new ParmID((String) dataAttributes.get("parmID"));
GridType gridType = GridType.valueOf((String) dataAttributes
.get("gridType"));
String descriptiveName = (String) dataAttributes.get("descriptiveName");
String unit = (String) dataAttributes.get("unitString");
Float minValue = (Float) dataAttributes.get("minValue");
Float maxValue = (Float) dataAttributes.get("maxValue");
int precision = (Integer) dataAttributes.get("precision");
boolean timeIndependentParm = (Boolean) dataAttributes
.get("timeIndependentParm");
boolean rateParm = (Boolean) dataAttributes.get("rateParm");
GridParmInfo gpi = new GridParmInfo(parmId, gridLoc, gridType, unit,
descriptiveName, minValue, maxValue, precision,
timeIndependentParm, timeConstraints, rateParm);
return gpi;
}

View file

@ -35,35 +35,33 @@ import com.raytheon.edex.plugin.gfe.config.IFPServerConfigManager;
import com.raytheon.edex.plugin.gfe.exception.GfeConfigurationException;
import com.raytheon.edex.plugin.gfe.server.D2DSatParm;
import com.raytheon.edex.plugin.gfe.server.GridParmManager;
import com.raytheon.edex.plugin.gfe.server.database.D2DGridDatabase;
import com.raytheon.edex.plugin.gfe.server.database.D2DSatDatabase;
import com.raytheon.edex.plugin.gfe.server.database.D2DSatDatabaseManager;
import com.raytheon.edex.plugin.gfe.smartinit.SmartInitQueue;
import com.raytheon.edex.plugin.gfe.smartinit.SmartInitRecord;
import com.raytheon.edex.plugin.gfe.smartinit.SmartInitRecordPK;
import com.raytheon.edex.plugin.gfe.util.GridTranslator;
import com.raytheon.edex.plugin.gfe.util.SendNotifications;
import com.raytheon.uf.common.dataplugin.gfe.GridDataHistory;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID.DataType;
import com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID;
import com.raytheon.uf.common.dataplugin.gfe.server.notify.DBInvChangeNotification;
import com.raytheon.uf.common.dataplugin.gfe.server.notify.GfeNotification;
import com.raytheon.uf.common.dataplugin.gfe.server.notify.GridUpdateNotification;
import com.raytheon.uf.common.dataplugin.grid.GridRecord;
import com.raytheon.uf.common.dataplugin.message.DataURINotificationMessage;
import com.raytheon.uf.common.dataplugin.level.Level;
import com.raytheon.uf.common.dataplugin.satellite.SatelliteRecord;
import com.raytheon.uf.common.message.WsId;
import com.raytheon.uf.common.parameter.mapping.ParameterMapper;
import com.raytheon.uf.common.serialization.SerializationUtil;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.common.time.TimeRange;
import com.raytheon.uf.common.util.mapping.MultipleMappingException;
import com.raytheon.uf.edex.core.EDEXUtil;
/**
* TODO Add Description
* Filters data URI notifications and sends GridUpdate and DbInvChanged
* notifications for new D2D data
*
* <pre>
*
@ -78,6 +76,7 @@ import com.raytheon.uf.edex.core.EDEXUtil;
* Feb 15, 2013 1638 mschenke Moved DataURINotificationMessage to uf.common.dataplugin
* Mar 25, 2013 1823 dgilling Trigger SAT smart init based only on record's
* SectorId and PhysicalElement.
* Mar 20, 2013 #1774 randerso Refactor to use grid durations from D2DGridDatabase
*
* </pre>
*
@ -125,7 +124,6 @@ public class GfeIngestNotificationFilter {
Map<SmartInitRecordPK, SmartInitRecord> inits = new HashMap<SmartInitRecordPK, SmartInitRecord>();
// Loop through each record received and construct a ParmID
Map<ParmID, List<TimeRange>> gridInv = new HashMap<ParmID, List<TimeRange>>();
List<GridUpdateNotification> guns = new ArrayList<GridUpdateNotification>();
Set<DatabaseID> newDbs = new HashSet<DatabaseID>();
IFPServerConfig config = null;
@ -139,12 +137,11 @@ public class GfeIngestNotificationFilter {
for (GridRecord grid : gridRecords) {
String gfeModel = config.gfeModelNameMapping(grid
.getDatasetId());
DatabaseID dbId = D2DGridDatabase.getDbId(grid.getDatasetId(),
grid.getDataTime().getRefTime(), config);
// ignore if no mapping
if (gfeModel != null && gfeModel.length() > 0) {
DatabaseID dbId = new DatabaseID(site, DataType.GRID,
"D2D", gfeModel, grid.getDataTime().getRefTime());
if (dbId != null) {
if ((!D2DParmIdCache.getInstance().getDatabaseIDs()
.contains(dbId))
&& (!newDbs.contains(dbId))) {
@ -159,33 +156,22 @@ public class GfeIngestNotificationFilter {
}
String abbrev = grid.getParameter().getAbbreviation();
String gfeParmName = null;
try {
gfeParmName = ParameterMapper.getInstance()
.lookupAlias(abbrev, "gfeParamName");
} catch (MultipleMappingException e) {
statusHandler.handle(Priority.WARN,
e.getLocalizedMessage(), e);
gfeParmName = e.getArbitraryMapping();
}
Level level = grid.getLevel();
String level = GridTranslator.getShortLevelName(grid
.getLevel().getMasterLevel().getName(), grid
.getLevel().getLevelonevalue(), grid.getLevel()
.getLeveltwovalue());
ParmID parmID = new ParmID(gfeParmName, dbId, level);
D2DGridDatabase db = (D2DGridDatabase) GridParmManager
.getDb(dbId);
ParmID parmID = db.getParmId(abbrev, level);
List<TimeRange> trs = gridInv.get(parmID);
if (trs == null) {
trs = new ArrayList<TimeRange>();
gridInv.put(parmID, trs);
}
TimeRange validPeriod = grid.getDataTime().getValidPeriod();
if (validPeriod.getDuration() > 0) {
trs.add(validPeriod);
} else {
trs.add(new TimeRange(grid.getDataTime()
.getValidPeriod().getStart(), 3600 * 1000));
Integer fcstHour = grid.getDataTime().getFcstTime();
TimeRange tr = db.getTimeRange(parmID, fcstHour);
if (tr != null) {
trs.add(tr);
}
List<String> siteInitModules = config.initModels(gfeModel);
@ -216,6 +202,7 @@ public class GfeIngestNotificationFilter {
}
// DR 15442 - move last for loop out of the for loop at line 110
List<GridUpdateNotification> guns = new ArrayList<GridUpdateNotification>();
for (ParmID parmId : gridInv.keySet()) {
try {
List<TimeRange> trs = gridInv.get(parmId);

View file

@ -1,152 +1,437 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--
Mar 20, 2013 #1774 randerso Added all parms from dataFieldTable.txt
sorted lists for ease of update
-->
<aliasList caseSensitive="true" namespace="gfeParamName">
<alias base="WGH">wgh</alias>
<alias base="AV">av</alias>
<alias base="CRAIN">crain</alias>
<alias base="CFRZR">cfrzr</alias>
<alias base="CICEP">cicep</alias>
<alias base="CSNOW">csnow</alias>
<alias base="CAPE">cape</alias>
<alias base="CIn">cin</alias>
<alias base="CP">cp</alias>
<alias base="CP3hr">cp3hr</alias>
<alias base="DpD">dpd</alias>
<alias base="DpT">dpt</alias>
<alias base="WVDIR">wvdir</alias>
<alias base="SWDIR">swdir</alias>
<alias base="EPT">ept</alias>
<alias base="GeH">geh</alias>
<alias base="GH">gh</alias>
<alias base="HIdx">hidx</alias>
<alias base="LgSP">lgsp</alias>
<alias base="LgSP3hr">lgsp3hr</alias>
<alias base="LHF">lhf</alias>
<alias base="MnT">mnt</alias>
<alias base="WVPER">wvper</alias>
<alias base="SWPER">swper</alias>
<alias base="MxT">mxt</alias>
<alias base="PLI">pli</alias>
<alias base="PoT">pot</alias>
<alias base="P">p</alias>
<alias base="PMSL">pmsl</alias>
<alias base="EMSP">emsp</alias>
<alias base="MMSP">mmsp</alias>
<alias base="DIRPW">dirpw</alias>
<alias base="PERPW">perpw</alias>
<alias base="HTSGW">htsgw</alias>
<alias base="PR">pr</alias>
<alias base="CPOFP">cpofp</alias>
<alias base="CPOZP">cpozp</alias>
<alias base="PW">pw</alias>
<alias base="RH">rh</alias>
<alias base="SHF">shf</alias>
<alias base="DIRSW">dirsw</alias>
<alias base="PERSW">persw</alias>
<alias base="WVHGT">wvhgt</alias>
<alias base="SWELL">swell</alias>
<alias base="SCP">scp</alias>
<alias base="SnD">snd</alias>
<alias base="SH">sh</alias>
<alias base="Heli">heli</alias>
<alias base="SLI">sli</alias>
<alias base="BLI">bli</alias>
<alias base="T">t</alias>
<alias base="TCC">tcc</alias>
<alias base="ThP">thp</alias>
<alias base="TP">tp</alias>
<alias base="TP3hr">tp3hr</alias>
<alias base="TP6hr">tp6hr</alias>
<alias base="TP12hr">tp12hr</alias>
<alias base="TP24hr">tp24hr</alias>
<alias base="TP48hr">tp48hr</alias>
<alias base="USTM">ustm</alias>
<alias base="VSTM">vstm</alias>
<alias base="uW">uw</alias>
<alias base="vW">vw</alias>
<alias base="VAPP">vapp</alias>
<alias base="PVV">pvv</alias>
<alias base="Vis">vis</alias>
<alias base="VPT">vpt</alias>
<alias base="WEASD">weasd</alias>
<alias base="WD">wd</alias>
<alias base="WS">ws</alias>
<alias base="WGS">wgs</alias>
<alias base="MSG">msg</alias>
<alias base="SVV">svv</alias>
<alias base="GVV">gvv</alias>
<alias base="KI">ki</alias>
<alias base="TKE">tke</alias>
<!-- Parameters below this point are not defined in parameter definition
files. Since these are not very well defined parameters they will only be
used if the grib decoder happens to give parameters the same base abbreviation.
In the future more work should be done to merge these names into definition
files. -->
<alias base="CCP">ccpc</alias>
<alias base="Pchg">pt3</alias>
<alias base="VV">ww</alias>
<alias base="TP-HPC">tp_HPC</alias>
<alias base="TP-ACR">tp_ACR</alias>
<alias base="TP-ALR">tp_ALR</alias>
<alias base="TP-FWR">tp_FWR</alias>
<alias base="TP-KRF">tp_KRF</alias>
<alias base="TP-MSR">tp_MSR</alias>
<alias base="TP-ORN">tp_ORN</alias>
<alias base="TP-PTR">tp_PTR</alias>
<alias base="TP-RHA">tp_RHA</alias>
<alias base="TP-RSA">tp_RSA</alias>
<alias base="TP-STR">tp_STR</alias>
<alias base="TP-TAR">tp_TAR</alias>
<alias base="TP-TIR">tp_TIR</alias>
<alias base="TP-TUA">tp_TUA</alias>
<alias base="TP3mean">tpmean3</alias>
<alias base="TP6mean">tpmean6</alias>
<alias base="TP12mean">tpmean12</alias>
<alias base="TP24mean">tpmean24</alias>
<alias base="SNOL12mean">snolmean12</alias>
<alias base="TP3sprd">tpsprd3</alias>
<alias base="TP6sprd">tpsprd6</alias>
<alias base="TP12sprd">tpsprd12</alias>
<alias base="TP24sprd">tpsprd24</alias>
<alias base="SNOL12sprd">snolsprd12</alias>
<alias base="QPE01">qpe1</alias>
<alias base="QPE06">qpe6</alias>
<alias base="TPCSG">Surge10Pct</alias>
<alias base="TPCSG-305E2">PSurge10Ft</alias>
<alias base="TPCSG-274E2">PSurge9Ft</alias>
<alias base="TPCSG-244E2">PSurge8Ft</alias>
<alias base="TPCSG-213E2">PSurge7Ft</alias>
<alias base="TPCSG-183E2">PSurge6Ft</alias>
<alias base="TPCSG-152E2">PSurge5Ft</alias>
<alias base="TPCSG-122E2">PSurge4Ft</alias>
<alias base="TPCSG-91E2">PSurge3Ft</alias>
<alias base="TPCSG-61E2">PSurge2Ft</alias>
<alias base="SIPD">sld</alias>
<alias base="MAXRH3hr">maxRH3hr</alias>
<alias base="MAXRH12hr">maxRH12hr</alias>
<alias base="MINRH3hr">minRH3hr</alias>
<alias base="MINRH12hr">minRH12hr</alias>
<alias base="TPCSG-SLOSH">SloshSurge</alias>
<alias base="TPCSG-20">Surge20Pct</alias>
<alias base="TPCSG-30">Surge30Pct</alias>
<alias base="TPCSG-40">Surge40Pct</alias>
<alias base="TPCSG-50">Surge50Pct</alias>
<alias base="TPCSG-60">Surge60Pct</alias>
<alias base="TPCSG-70">Surge70Pct</alias>
<alias base="TPCSG-80">Surge80Pct</alias>
<alias base="TPCSG-90">Surge90Pct</alias>
<alias base="TPCSG-335E2">PSurge11Ft</alias>
<alias base="TPCSG-366E2">PSurge12Ft</alias>
<alias base="TPCSG-396E2">PSurge13Ft</alias>
<alias base="TPCSG-427E2">PSurge14Ft</alias>
<alias base="TPCSG-457E2">PSurge15Ft</alias>
<alias base="TPCSG-488E2">PSurge16Ft</alias>
<alias base="TPCSG-518E2">PSurge17Ft</alias>
<alias base="TPCSG-549E2">PSurge18Ft</alias>
<alias base="TPCSG-579E2">PSurge19Ft</alias>
<alias base="TPCSG-610E2">PSurge20Ft</alias>
<alias base="TPCSG-640E2">PSurge21Ft</alias>
<alias base="TPCSG-671E2">PSurge22Ft</alias>
<alias base="TPCSG-701E2">PSurge23Ft</alias>
<alias base="TPCSG-732E2">PSurge24Ft</alias>
<alias base="TPCSG-762E2">PSurge25Ft</alias>
<alias base="AV">av</alias>
<alias base="CAPE">cape</alias>
<alias base="CFRZR">cfrzr</alias>
<alias base="CICEP">cicep</alias>
<alias base="CIn">cin</alias>
<alias base="CP3hr">cp3hr</alias>
<alias base="CP">cp</alias>
<alias base="CPOFP">cpofp</alias>
<alias base="CPOZP">cpozp</alias>
<alias base="CRAIN">crain</alias>
<alias base="CSNOW">csnow</alias>
<alias base="DIRPW">dirpw</alias>
<alias base="DIRSW">dirsw</alias>
<alias base="DpD">dpd</alias>
<alias base="DpT">dpt</alias>
<alias base="EMSP">emsp</alias>
<alias base="EPT">ept</alias>
<alias base="GeH">geh</alias>
<alias base="GH">gh</alias>
<alias base="GVV">gvv</alias>
<alias base="Heli">heli</alias>
<alias base="HIdx">hidx</alias>
<alias base="HTSGW">htsgw</alias>
<alias base="KI">ki</alias>
<alias base="LgSP3hr">lgsp3hr</alias>
<alias base="LgSP">lgsp</alias>
<alias base="LHF">lhf</alias>
<alias base="MMSP">mmsp</alias>
<alias base="MnT">mnt</alias>
<alias base="MSG">msg</alias>
<alias base="MxT">mxt</alias>
<alias base="PERPW">perpw</alias>
<alias base="PERSW">persw</alias>
<alias base="PLI">pli</alias>
<alias base="PMSL">pmsl</alias>
<alias base="PoT">pot</alias>
<alias base="P">p</alias>
<alias base="PR">pr</alias>
<alias base="PVV">pvv</alias>
<alias base="PW">pw</alias>
<alias base="RH">rh</alias>
<alias base="SCP">scp</alias>
<alias base="SHF">shf</alias>
<alias base="SH">sh</alias>
<alias base="SLI">sli</alias>
<alias base="SnD">snd</alias>
<alias base="SVV">svv</alias>
<alias base="SWDIR">swdir</alias>
<alias base="SWELL">swell</alias>
<alias base="SWPER">swper</alias>
<alias base="TCC">tcc</alias>
<alias base="ThP">thp</alias>
<alias base="TKE">tke</alias>
<alias base="TP12hr">tp12hr</alias>
<alias base="TP24hr">tp24hr</alias>
<alias base="TP3hr">tp3hr</alias>
<alias base="TP48hr">tp48hr</alias>
<alias base="TP6hr">tp6hr</alias>
<alias base="TP">tp</alias>
<alias base="T">t</alias>
<alias base="USTM">ustm</alias>
<alias base="uW">uw</alias>
<alias base="VAPP">vapp</alias>
<alias base="Vis">vis</alias>
<alias base="VPT">vpt</alias>
<alias base="VSTM">vstm</alias>
<alias base="vW">vw</alias>
<alias base="WD">wd</alias>
<alias base="WEASD">weasd</alias>
<alias base="WGH">wgh</alias>
<alias base="WGS">wgs</alias>
<alias base="WS">ws</alias>
<alias base="WVDIR">wvdir</alias>
<alias base="WVHGT">wvhgt</alias>
<alias base="WVPER">wvper</alias>
<!-- Parameters below this point are not defined in parameter definition
files. Since these are not very well defined parameters they will only be
used if the grib decoder happens to give parameters the same base abbreviation.
In the future more work should be done to merge these names into definition
files. -->
<alias base="ADIMC">adimc</alias>
<alias base="Alti">alti</alias>
<alias base="BH">bh</alias>
<alias base="BLI">bli</alias>
<alias base="BPVV">bpvv</alias>
<alias base="BWu">bwu</alias>
<alias base="BWv">bwv</alias>
<alias base="CAPEc1">capec1</alias>
<alias base="CAPEc2">capec2</alias>
<alias base="CAPEc3">capec3</alias>
<alias base="CAPEc4">capec4</alias>
<alias base="CAPEc5">capec5</alias>
<alias base="CB">cb</alias>
<alias base="CC">cc</alias>
<alias base="CCOV">ccov</alias>
<alias base="CCP">ccpc</alias>
<alias base="CFRZRc1">cfrzrc1</alias>
<alias base="CFRZRmean">cfrzrmean</alias>
<alias base="CFRZRsprd">cfrzrsprd</alias>
<alias base="CIce">cice</alias>
<alias base="CICEPc1">cicepc1</alias>
<alias base="CICEPmean">cicepmean</alias>
<alias base="CICEPsprd">cicepsprd</alias>
<alias base="Cigc1">cigc1</alias>
<alias base="Cigc2">cigc2</alias>
<alias base="Cigc3">cigc3</alias>
<alias base="CP2hr">cp2hr</alias>
<alias base="CPVV">cpvv</alias>
<alias base="CRAINc1">crainc1</alias>
<alias base="CRAINmean">crainmean</alias>
<alias base="CRAINsprd">crainsprd</alias>
<alias base="CSNOWc1">csnowc1</alias>
<alias base="CSNOWmean">csnowmean</alias>
<alias base="CSNOWsprd">csnowsprd</alias>
<alias base="CSSI">cssi</alias>
<alias base="CTop">ctop</alias>
<alias base="CTSTM">ctstm</alias>
<alias base="CTyp">ctyp</alias>
<alias base="CW">cw</alias>
<alias base="CXR">cxr</alias>
<alias base="DpTerranl">dpterranl</alias>
<alias base="DpTmean">dptmean</alias>
<alias base="DpTsprd">dptsprd</alias>
<alias base="ELON">elon</alias>
<alias base="FD">fd</alias>
<alias base="FZNP">fznp</alias>
<alias base="GHmean">ghmean</alias>
<alias base="GHsprd">ghsprd</alias>
<alias base="HyC">hyc</alias>
<alias base="ICEC">icec</alias>
<alias base="ICEG">iceg</alias>
<alias base="ICNG">icng</alias>
<alias base="ICPRB">icprb</alias>
<alias base="ICSEV">icsev</alias>
<alias base="IIdx">iidx</alias>
<alias base="ILW">ilw</alias>
<alias base="IP">ip</alias>
<alias base="LgSP2hr">lgsp2hr</alias>
<alias base="LLIP">llip</alias>
<alias base="LLR">llr</alias>
<alias base="LZFPC">lzfpc</alias>
<alias base="LZFSC">lzfsc</alias>
<alias base="LZTWC">lztwc</alias>
<alias base="MAdv">madv</alias>
<alias base="MAXRH12hr">maxRH12hr</alias>
<alias base="MAXRH3hr">maxRH3hr</alias>
<alias base="MCDD">mcdd</alias>
<alias base="MCon">mcon</alias>
<alias base="MINRH12hr">minRH12hr</alias>
<alias base="MINRH3hr">minRH3hr</alias>
<alias base="MnT12hr">mnt12hr</alias>
<alias base="MnT3hr">mnt3hr</alias>
<alias base="MnT6hr">mnt6hr</alias>
<alias base="MRET">mret</alias>
<alias base="MSLP">mslp</alias>
<alias base="MWu">mwu</alias>
<alias base="MWv">mwv</alias>
<alias base="MxT12hr">mxt12hr</alias>
<alias base="MxT3hr">mxt3hr</alias>
<alias base="MxT6hr">mxt6hr</alias>
<alias base="NBE">nbe</alias>
<alias base="NLAT">nlat</alias>
<alias base="NLRS">nlrs</alias>
<alias base="OTIM">otim</alias>
<alias base="PAcc">pacc</alias>
<alias base="PBE">pbe</alias>
<alias base="Pchg">pt3</alias>
<alias base="PC">pc</alias>
<alias base="Perranl">perranl</alias>
<alias base="PICE">pice</alias>
<alias base="PLIxc1">plixc1</alias>
<alias base="PLIxc2">plixc2</alias>
<alias base="PLIxc3">plixc3</alias>
<alias base="PLIxc4">plixc4</alias>
<alias base="PLIxc5">plixc5</alias>
<alias base="PMSLmean">pmslmean</alias>
<alias base="PMSLsprd">pmslsprd</alias>
<alias base="POP12hr">pop12hr</alias>
<alias base="POP3hr">pop3hr</alias>
<alias base="POP6hr">pop6hr</alias>
<alias base="POP">pop</alias>
<alias base="PPAM">ppam</alias>
<alias base="PPAN">ppan</alias>
<alias base="PPAS">ppas</alias>
<alias base="PPBM">ppbm</alias>
<alias base="PPBN">ppbn</alias>
<alias base="PPBS">ppbs</alias>
<alias base="PPFFG">ppffg</alias>
<alias base="PPNN">ppnn</alias>
<alias base="prcp12hr">prcp12hr</alias>
<alias base="prcp3hr">prcp3hr</alias>
<alias base="prcp6hr">prcp6hr</alias>
<alias base="Prob34">prob34</alias>
<alias base="Prob50">prob50</alias>
<alias base="Prob64">prob64</alias>
<alias base="PTAM">ptam</alias>
<alias base="PTAN">ptan</alias>
<alias base="PTA">pta</alias>
<alias base="PTAS">ptas</alias>
<alias base="PTBM">ptbm</alias>
<alias base="PTBN">ptbn</alias>
<alias base="PTBS">ptbs</alias>
<alias base="PTNN">ptnn</alias>
<alias base="PTOR">ptor</alias>
<alias base="PT">pt</alias>
<alias base="PTT">ptt</alias>
<alias base="PTyp">ptyp</alias>
<alias base="PWmean">pwmean</alias>
<alias base="PWS34">pws34</alias>
<alias base="PWS50">pws50</alias>
<alias base="PWS64">pws64</alias>
<alias base="PWsprd">pwsprd</alias>
<alias base="QPE01">qpe1</alias>
<alias base="QPE06">qpe6</alias>
<alias base="QPE24">qpe24</alias>
<alias base="RAIN">rain</alias>
<alias base="REFC">refc</alias>
<alias base="REFD">refd</alias>
<alias base="RHmean">rhmean</alias>
<alias base="RHsprd">rhsprd</alias>
<alias base="ROUTED_FLOW_C">routed_flow_c</alias>
<alias base="ROUTED_FLOW_H">routed_flow_h</alias>
<alias base="ROUTED_FLOW_M">routed_flow_m</alias>
<alias base="ROUTED_FLOW">routed_flow</alias>
<alias base="RR">rr</alias>
<alias base="RRV">rrv</alias>
<alias base="S1Hr">s1hr</alias>
<alias base="SAcc">sacc</alias>
<alias base="SHerranl">sherranl</alias>
<alias base="shWlt">shwlt</alias>
<alias base="SIPD">sld</alias>
<alias base="SI">si</alias>
<alias base="SMC">smc</alias>
<alias base="SNOL12c10">snol12c10</alias>
<alias base="SNOL12c1">snol12c1</alias>
<alias base="SNOL12c2">snol12c2</alias>
<alias base="SNOL12c3">snol12c3</alias>
<alias base="SNOL12c4">snol12c4</alias>
<alias base="SNOL12c5">snol12c5</alias>
<alias base="SNOL12c6">snol12c6</alias>
<alias base="SNOL12c7">snol12c7</alias>
<alias base="SNOL12c8">snol12c8</alias>
<alias base="SNOL12c9">snol12c9</alias>
<alias base="SNOL12mean">snolmean12</alias>
<alias base="SNOL12sprd">snolsprd12</alias>
<alias base="snowd3hr">snowd3hr</alias>
<alias base="snowd6hr">snowd6hr</alias>
<alias base="SNOW">snow</alias>
<alias base="SPT">spt</alias>
<alias base="STOT">stot</alias>
<alias base="STPA">stpa</alias>
<alias base="ST">st</alias>
<alias base="TAdv">tadv</alias>
<alias base="Tc1">tc1</alias>
<alias base="Terranl">terranl</alias>
<alias base="ThP12hr">thp12hr</alias>
<alias base="ThP3hr">thp3hr</alias>
<alias base="ThP6hr">thp6hr</alias>
<alias base="Tmean">tmean</alias>
<alias base="TOTSN">totsn</alias>
<alias base="TP120hr">tp120hr</alias>
<alias base="TP12c1">tp12c1</alias>
<alias base="TP12c2">tp12c2</alias>
<alias base="TP12c3">tp12c3</alias>
<alias base="TP12c4">tp12c4</alias>
<alias base="TP12c5">tp12c5</alias>
<alias base="TP12c6">tp12c6</alias>
<alias base="TP12c7">tp12c7</alias>
<alias base="TP12c8">tp12c8</alias>
<alias base="TP12mean">tpmean12</alias>
<alias base="TP12sprd">tpsprd12</alias>
<alias base="TP24c1">tp24c1</alias>
<alias base="TP24c2">tp24c2</alias>
<alias base="TP24c3">tp24c3</alias>
<alias base="TP24c4">tp24c4</alias>
<alias base="TP24c5">tp24c5</alias>
<alias base="TP24c6">tp24c6</alias>
<alias base="TP24c7">tp24c7</alias>
<alias base="TP24c8">tp24c8</alias>
<alias base="TP24mean">tpmean24</alias>
<alias base="TP24sprd">tpsprd24</alias>
<alias base="TP3c1">tp3c1</alias>
<alias base="TP3c2">tp3c2</alias>
<alias base="TP3c3">tp3c3</alias>
<alias base="TP3c4">tp3c4</alias>
<alias base="TP3c5">tp3c5</alias>
<alias base="TP3c6">tp3c6</alias>
<alias base="TP3c7">tp3c7</alias>
<alias base="TP3c8">tp3c8</alias>
<alias base="TP3mean">tpmean3</alias>
<alias base="TP3sprd">tpsprd3</alias>
<alias base="TP6c1">tp6c1</alias>
<alias base="TP6c2">tp6c2</alias>
<alias base="TP6c3">tp6c3</alias>
<alias base="TP6c4">tp6c4</alias>
<alias base="TP6c5">tp6c5</alias>
<alias base="TP6c6">tp6c6</alias>
<alias base="TP6c7">tp6c7</alias>
<alias base="TP6c8">tp6c8</alias>
<alias base="TP6mean">tpmean6</alias>
<alias base="TP6sprd">tpsprd6</alias>
<alias base="TP_ACR">tp_ACR</alias>
<alias base="TP-ACR">tp_ACR</alias>
<alias base="TP_ALR">tp_ALR</alias>
<alias base="TP-ALR">tp_ALR</alias>
<alias base="TPCSG_122E2">PSurge4Ft</alias>
<alias base="TPCSG-122E2">PSurge4Ft</alias>
<alias base="TPCSG_152E2">PSurge5Ft</alias>
<alias base="TPCSG-152E2">PSurge5Ft</alias>
<alias base="TPCSG_183E2">PSurge6Ft</alias>
<alias base="TPCSG-183E2">PSurge6Ft</alias>
<alias base="TPCSG_20">Surge20Pct</alias>
<alias base="TPCSG-20">Surge20Pct</alias>
<alias base="TPCSG_213E2">PSurge7Ft</alias>
<alias base="TPCSG-213E2">PSurge7Ft</alias>
<alias base="TPCSG_244E2">PSurge8Ft</alias>
<alias base="TPCSG-244E2">PSurge8Ft</alias>
<alias base="TPCSG_274E2">PSurge9Ft</alias>
<alias base="TPCSG-274E2">PSurge9Ft</alias>
<alias base="TPCSG_305E2">PSurge10Ft</alias>
<alias base="TPCSG-305E2">PSurge10Ft</alias>
<alias base="TPCSG_30">Surge30Pct</alias>
<alias base="TPCSG-30">Surge30Pct</alias>
<alias base="TPCSG_335E2">PSurge11Ft</alias>
<alias base="TPCSG-335E2">PSurge11Ft</alias>
<alias base="TPCSG_366E2">PSurge12Ft</alias>
<alias base="TPCSG-366E2">PSurge12Ft</alias>
<alias base="TPCSG_396E2">PSurge13Ft</alias>
<alias base="TPCSG-396E2">PSurge13Ft</alias>
<alias base="TPCSG_40">Surge40Pct</alias>
<alias base="TPCSG-40">Surge40Pct</alias>
<alias base="TPCSG_427E2">PSurge14Ft</alias>
<alias base="TPCSG-427E2">PSurge14Ft</alias>
<alias base="TPCSG_457E2">PSurge15Ft</alias>
<alias base="TPCSG-457E2">PSurge15Ft</alias>
<alias base="TPCSG_488E2">PSurge16Ft</alias>
<alias base="TPCSG-488E2">PSurge16Ft</alias>
<alias base="TPCSG_50">Surge50Pct</alias>
<alias base="TPCSG-50">Surge50Pct</alias>
<alias base="TPCSG_518E2">PSurge17Ft</alias>
<alias base="TPCSG-518E2">PSurge17Ft</alias>
<alias base="TPCSG_549E2">PSurge18Ft</alias>
<alias base="TPCSG-549E2">PSurge18Ft</alias>
<alias base="TPCSG_579E2">PSurge19Ft</alias>
<alias base="TPCSG-579E2">PSurge19Ft</alias>
<alias base="TPCSG_60">Surge60Pct</alias>
<alias base="TPCSG-60">Surge60Pct</alias>
<alias base="TPCSG_610E2">PSurge20Ft</alias>
<alias base="TPCSG-610E2">PSurge20Ft</alias>
<alias base="TPCSG_61E2">PSurge2Ft</alias>
<alias base="TPCSG-61E2">PSurge2Ft</alias>
<alias base="TPCSG_640E2">PSurge21Ft</alias>
<alias base="TPCSG-640E2">PSurge21Ft</alias>
<alias base="TPCSG_671E2">PSurge22Ft</alias>
<alias base="TPCSG-671E2">PSurge22Ft</alias>
<alias base="TPCSG_701E2">PSurge23Ft</alias>
<alias base="TPCSG-701E2">PSurge23Ft</alias>
<alias base="TPCSG_70">Surge70Pct</alias>
<alias base="TPCSG-70">Surge70Pct</alias>
<alias base="TPCSG_732E2">PSurge24Ft</alias>
<alias base="TPCSG-732E2">PSurge24Ft</alias>
<alias base="TPCSG_762E2">PSurge25Ft</alias>
<alias base="TPCSG-762E2">PSurge25Ft</alias>
<alias base="TPCSG_80">Surge80Pct</alias>
<alias base="TPCSG-80">Surge80Pct</alias>
<alias base="TPCSG_90">Surge90Pct</alias>
<alias base="TPCSG-90">Surge90Pct</alias>
<alias base="TPCSG_91E2">PSurge3Ft</alias>
<alias base="TPCSG-91E2">PSurge3Ft</alias>
<alias base="TPCSG_SLOSH">SloshSurge</alias>
<alias base="TPCSG-SLOSH">SloshSurge</alias>
<alias base="TPCSG">Surge10Pct</alias>
<alias base="TP_ECMWF">tp_ecmwf</alias>
<alias base="TP_FWR">tp_FWR</alias>
<alias base="TP-FWR">tp_FWR</alias>
<alias base="TP_HPC">tp_HPC</alias>
<alias base="TP-HPC">tp_HPC</alias>
<alias base="TP_KRF">tp_KRF</alias>
<alias base="TP-KRF">tp_KRF</alias>
<alias base="TP_MSR">tp_MSR</alias>
<alias base="TP-MSR">tp_MSR</alias>
<alias base="TP_ORN">tp_ORN</alias>
<alias base="TP-ORN">tp_ORN</alias>
<alias base="TP_PTR">tp_PTR</alias>
<alias base="TP-PTR">tp_PTR</alias>
<alias base="TP_RHA">tp_RHA</alias>
<alias base="TP-RHA">tp_RHA</alias>
<alias base="TP_RSA">tp_RSA</alias>
<alias base="TP-RSA">tp_RSA</alias>
<alias base="TP_STR">tp_STR</alias>
<alias base="TP-STR">tp_STR</alias>
<alias base="TP_TAR">tp_TAR</alias>
<alias base="TP-TAR">tp_TAR</alias>
<alias base="TP_TIR">tp_TIR</alias>
<alias base="TP-TIR">tp_TIR</alias>
<alias base="TP_TUA">tp_TUA</alias>
<alias base="TP-TUA">tp_TUA</alias>
<alias base="TPW">tpw</alias>
<alias base="Tsprd">tsprd</alias>
<alias base="tTOT">ttot</alias>
<alias base="TURB">turb</alias>
<alias base="uWerranl">uwerranl</alias>
<alias base="uWmean">uwmean</alias>
<alias base="uWsprd">uwsprd</alias>
<alias base="UZFWC">uzfwc</alias>
<alias base="UZTWC">uztwc</alias>
<alias base="Visc1">visc1</alias>
<alias base="Visc2">visc2</alias>
<alias base="VMCC">vmcc</alias>
<alias base="VSS">vss</alias>
<alias base="VV">ww</alias>
<alias base="vWerranl">vwerranl</alias>
<alias base="vWmean">vwmean</alias>
<alias base="vWsprd">vwsprd</alias>
<alias base="WATER_DEPTH">water_depth</alias>
<alias base="WDerranl">wderranl</alias>
<alias base="WGD">wgd</alias>
<alias base="WOm">wom</alias>
<alias base="WSc1">wsc1</alias>
<alias base="WSc2">wsc2</alias>
<alias base="WSc3">wsc3</alias>
<alias base="WSc4">wsc4</alias>
<alias base="WSerranl">wserranl</alias>
<alias base="WSmean">wsmean</alias>
<alias base="WSp1">wsp1</alias>
<alias base="WSp2">wsp2</alias>
<alias base="WSp3">wsp3</alias>
<alias base="WSsprd">wssprd</alias>
<alias base="wxType">wx</alias>
<alias base="zAGL">zagl</alias>
</aliasList>

View file

@ -115,7 +115,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -115,7 +115,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -63,7 +63,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -64,7 +64,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -115,7 +115,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -217,7 +217,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -115,7 +115,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -43,7 +43,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -77,7 +77,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -64,7 +64,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -22,8 +22,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -106,7 +106,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
@ -258,7 +258,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>
@ -333,7 +333,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -378,7 +378,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -491,7 +491,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>

View file

@ -22,8 +22,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -106,7 +106,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
@ -258,7 +258,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>
@ -333,7 +333,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -378,7 +378,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -491,7 +491,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>

View file

@ -22,8 +22,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -106,7 +106,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
@ -258,7 +258,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>
@ -333,7 +333,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -378,7 +378,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -491,7 +491,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>

View file

@ -22,8 +22,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -106,7 +106,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
@ -258,7 +258,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>
@ -333,7 +333,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -378,7 +378,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -491,7 +491,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>

View file

@ -22,8 +22,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -106,7 +106,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
@ -258,7 +258,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>
@ -333,7 +333,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -378,7 +378,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -491,7 +491,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>

View file

@ -22,8 +22,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -106,7 +106,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
@ -258,7 +258,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>
@ -333,7 +333,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -378,7 +378,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -491,7 +491,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>

View file

@ -22,8 +22,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -106,7 +106,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
@ -258,7 +258,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>
@ -333,7 +333,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -378,7 +378,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -491,7 +491,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>

View file

@ -22,8 +22,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -106,7 +106,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
@ -258,7 +258,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>
@ -333,7 +333,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -378,7 +378,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -491,7 +491,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>

View file

@ -22,8 +22,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -106,7 +106,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
@ -258,7 +258,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>
@ -333,7 +333,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -378,7 +378,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -491,7 +491,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>

View file

@ -22,8 +22,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -106,7 +106,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
@ -258,7 +258,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>
@ -333,7 +333,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -378,7 +378,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -491,7 +491,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>

View file

@ -64,7 +64,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -43,7 +43,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -64,7 +64,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -95,7 +95,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -54,7 +54,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -54,7 +54,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -54,7 +54,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -115,7 +115,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -115,7 +115,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -115,7 +115,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -115,7 +115,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -43,7 +43,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -77,7 +77,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
</gridParamInfo>

View file

@ -87,7 +87,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -160,7 +160,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -72,7 +72,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -129,7 +129,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -111,7 +111,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -168,7 +168,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -156,7 +156,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -244,7 +244,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -93,7 +93,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -210,7 +210,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -109,7 +109,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -226,7 +226,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -73,7 +73,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -145,7 +145,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -73,7 +73,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -145,7 +145,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -134,7 +134,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -134,7 +134,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -56,7 +56,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -56,7 +56,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -185,7 +185,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -87,7 +87,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -407,7 +407,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -407,7 +407,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -113,7 +113,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -231,7 +231,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -113,7 +113,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -231,7 +231,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -113,7 +113,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -34,8 +34,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -138,7 +138,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
@ -446,7 +446,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>
@ -521,7 +521,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -566,7 +566,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -685,7 +685,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>
@ -700,7 +700,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>

View file

@ -34,8 +34,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -138,7 +138,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
@ -446,7 +446,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>
@ -521,7 +521,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -566,7 +566,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -685,7 +685,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>
@ -700,7 +700,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>

View file

@ -170,7 +170,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -81,7 +81,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -46,7 +46,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>
@ -61,7 +61,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -191,8 +191,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -212,7 +212,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -366,13 +366,13 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -453,7 +453,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>

View file

@ -46,7 +46,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>
@ -61,7 +61,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -191,8 +191,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -212,7 +212,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -366,13 +366,13 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -453,7 +453,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>

View file

@ -117,7 +117,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -204,7 +204,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -46,7 +46,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>
@ -61,7 +61,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -191,8 +191,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -212,7 +212,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -366,13 +366,13 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -453,7 +453,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>

View file

@ -117,7 +117,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -240,7 +240,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -46,7 +46,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>crain</short_name>
<long_name>Categorical rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalRain</uiname>
<valid_range>0.0</valid_range>
@ -61,7 +61,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cfrzr</short_name>
<long_name>Categorical freezing rain</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalFrzRain</uiname>
<valid_range>0.0</valid_range>
@ -191,8 +191,8 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>weasd</short_name>
<long_name>water equivalent of accumulated snow depth</long_name>
<units>ml</units>
<udunits>mil</udunits>
<units>mm</units>
<udunits>millimeter</udunits>
<uiname>waterEqvAccSnowDepth</uiname>
<valid_range>0.0</valid_range>
<valid_range>1000.0</valid_range>
@ -212,7 +212,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>av</short_name>
<long_name>absolute vorticity</long_name>
<units>1/s</units>
<units>/s</units>
<udunits>1/second</udunits>
<uiname>absVort</uiname>
<valid_range>-0.00999999977648</valid_range>
@ -366,13 +366,13 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>csnow</short_name>
<long_name>Categorical snow</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalSnow</uiname>
<valid_range>0.0</valid_range>
@ -453,7 +453,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>cicep</short_name>
<long_name>Categorical ice pellets</long_name>
<units>yes=1, no=0</units>
<units>yn</units>
<udunits/>
<uiname>CategoricalIcePlt</uiname>
<valid_range>0.0</valid_range>

View file

@ -66,7 +66,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -111,7 +111,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
</gridParamInfo>

View file

@ -87,7 +87,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -79,7 +79,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">

View file

@ -1,4 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Mar 20, 2013 #1774 randerso Fixed wx definition
-->
<gridParamInfo xmlns:ns2="group">
<valtimeMINUSreftime>
<fcst>302400</fcst>
@ -105,7 +108,7 @@
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>staticCoriolis</short_name>
<long_name>Coriolis parameter</long_name>
<units>/second</units>
<units>/s</units>
<fillValue>-99999.0</fillValue>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
@ -124,13 +127,13 @@
</levels>
</gridParameterInfo>
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
<short_name>wxType</short_name>
<short_name>wx</short_name>
<long_name>Weather</long_name>
<units/>
<udunits/>
<uiname>Weather</uiname>
<valid_range>0.0</valid_range>
<valid_range>12.0</valid_range>
<valid_range>10.0</valid_range>
<fillValue>-99999.0</fillValue>
<n3D>0</n3D>
<levelsDesc>SFC</levelsDesc>

Some files were not shown because too many files have changed in this diff Show more