diff --git a/cave/com.raytheon.viz.core.contours/META-INF/MANIFEST.MF b/cave/com.raytheon.viz.core.contours/META-INF/MANIFEST.MF
index a5b97975fe..87fb68a9e3 100644
--- a/cave/com.raytheon.viz.core.contours/META-INF/MANIFEST.MF
+++ b/cave/com.raytheon.viz.core.contours/META-INF/MANIFEST.MF
@@ -1,23 +1,21 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
-Bundle-Name: Contours Plug-in
-Bundle-SymbolicName: com.raytheon.viz.core.contours;singleton:=true
-Bundle-Version: 1.12.1174.qualifier
-Bundle-Activator: com.raytheon.viz.core.contours.Activator
+Bundle-Name: Contour Generation and Display
+Bundle-SymbolicName: com.raytheon.viz.core.contours
+Bundle-Version: 1.14.0.qualifier
Bundle-Vendor: Raytheon
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.ui,
- com.raytheon.uf.common.datastorage;bundle-version="1.12.1174",
- com.raytheon.uf.common.geospatial;bundle-version="1.12.1174",
- com.raytheon.uf.common.status;bundle-version="1.12.1174",
- com.raytheon.uf.common.util;bundle-version="1.12.1174",
- com.raytheon.uf.viz.core;bundle-version="1.12.1174",
- com.raytheon.uf.common.wxmath;bundle-version="1.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
+Require-Bundle: com.raytheon.uf.viz.core;bundle-version="1.14.1",
+ org.eclipse.core.runtime,
+ org.eclipse.ui,
+ com.raytheon.uf.common.geospatial,
+ com.raytheon.uf.common.util,
+ com.raytheon.uf.common.wxmath,
+ com.raytheon.uf.common.style,
+ com.raytheon.uf.common.status,
+ org.apache.commons.collections
+Import-Package: com.raytheon.viz.core.interval
Export-Package: com.raytheon.viz.core.contours,
com.raytheon.viz.core.contours.rsc.displays,
com.raytheon.viz.core.contours.util
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Import-Package: com.raytheon.uf.common.style,
- com.raytheon.uf.common.style.contour,
- com.raytheon.viz.core.interval
diff --git a/cave/com.raytheon.viz.core.contours/build.properties b/cave/com.raytheon.viz.core.contours/build.properties
index e9863e281e..5b359b5b78 100644
--- a/cave/com.raytheon.viz.core.contours/build.properties
+++ b/cave/com.raytheon.viz.core.contours/build.properties
@@ -1,5 +1,4 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
- .,\
- plugin.xml
+ .
\ No newline at end of file
diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/Activator.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/Activator.java
deleted file mode 100644
index 2471323236..0000000000
--- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/Activator.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * 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.viz.core.contours;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Activator extends AbstractUIPlugin {
-
- // The plug-in ID
- public static final String PLUGIN_ID = "com.raytheon.viz.core.contours";
-
- // The shared instance
- private static Activator plugin;
-
- /**
- * The constructor
- */
- public Activator() {
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
- */
- public void start(BundleContext context) throws Exception {
- super.start(context);
- plugin = this;
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
- */
- public void stop(BundleContext context) throws Exception {
- plugin = null;
- super.stop(context);
- }
-
- /**
- * Returns the shared instance
- *
- * @return the shared instance
- */
- public static Activator getDefault() {
- return plugin;
- }
-
-}
diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourCreateRequest.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourCreateRequest.java
index 69d8232746..5f3aa6fb9a 100644
--- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourCreateRequest.java
+++ b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourCreateRequest.java
@@ -21,7 +21,7 @@ package com.raytheon.viz.core.contours;
import org.geotools.coverage.grid.GeneralGridGeometry;
-import com.raytheon.uf.common.datastorage.records.IDataRecord;
+import com.raytheon.uf.common.geospatial.interpolation.data.DataSource;
import com.raytheon.uf.common.style.contour.ContourPreferences;
import com.raytheon.uf.viz.core.IExtent;
import com.raytheon.uf.viz.core.IGraphicsTarget;
@@ -39,9 +39,11 @@ import com.raytheon.viz.core.contours.ContourSupport.ContourGroup;
*
* SOFTWARE HISTORY
*
- * Date Ticket# Engineer Description
- * ------------ ---------- ----------- --------------------------
- * Feb 25, 2011 ekladstrup Initial creation
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Feb 25, 2011 ekladstrup Initial creation
+ * Feb 27, 2014 2791 bsteffen Switch from IDataRecord to DataSource
+ *
*
*
*
@@ -50,14 +52,14 @@ import com.raytheon.viz.core.contours.ContourSupport.ContourGroup;
*/
public class ContourCreateRequest {
- public ContourCreateRequest(String identifier, IDataRecord[] record,
+ public ContourCreateRequest(String identifier, DataSource[] source,
float level, IExtent pixelExtent, double currentDensity,
double currentMagnification, GeneralGridGeometry imageGridGeometry,
IGraphicsTarget target, IMapDescriptor descriptor,
ContourPreferences prefs, float zoom) {
super();
this.identifier = identifier;
- this.record = record;
+ this.source = source;
this.level = level;
this.pixelExtent = pixelExtent;
this.imageGridGeometry = imageGridGeometry;
@@ -79,12 +81,12 @@ public class ContourCreateRequest {
this.identifier = identifier;
}
- public IDataRecord[] getRecord() {
- return record;
+ public DataSource[] getSource() {
+ return source;
}
- public void setRecord(IDataRecord[] record) {
- this.record = record;
+ public void setSource(DataSource[] source) {
+ this.source = source;
}
public float getLevel() {
@@ -183,7 +185,7 @@ public class ContourCreateRequest {
private String identifier;
- private IDataRecord[] record;
+ private DataSource[] source;
private float level;
diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourManagerJob.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourManagerJob.java
index 5594a15a65..28d1fd9698 100644
--- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourManagerJob.java
+++ b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourManagerJob.java
@@ -37,9 +37,10 @@ import com.raytheon.viz.core.contours.ContourSupport.ContourGroup;
*
* SOFTWARE HISTORY
*
- * Date Ticket# Engineer Description
- * ------------ ---------- ----------- --------------------------
- * Oct 24, 2007 chammack Initial Creation.
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Oct 24, 2007 chammack Initial Creation.
+ * Feb 27, 2014 2791 bsteffen Switch from IDataRecord to DataSource
*
*
*
@@ -114,9 +115,10 @@ public class ContourManagerJob extends Job {
;// request has been canceled or contours exist
} else {
long t0 = System.currentTimeMillis();
- ContourGroup cg = ContourSupport.createContours(
- req.getRecord(), req.getLevel(),
- req.getPixelExtent(), req.getCurrentDensity(),
+ ContourGroup cg = null;
+ cg = ContourSupport.createContours(req.getSource(),
+ req.getLevel(), req.getPixelExtent(),
+ req.getCurrentDensity(),
req.getCurrentMagnification(),
req.getImageGridGeometry(), req.getTarget(),
req.getDescriptor(), req.getPrefs(), req.getZoom());
@@ -126,7 +128,8 @@ public class ContourManagerJob extends Job {
+ (System.currentTimeMillis() - t0));
}
} catch (Throwable e) {
- return new Status(Status.ERROR, Activator.PLUGIN_ID,
+ return new Status(Status.ERROR, ContourManagerJob.class
+ .getPackage().getName(),
"Error creating contours", e);
}
diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourRenderable.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourRenderable.java
index ba06aebbc2..87f17ec27c 100644
--- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourRenderable.java
+++ b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourRenderable.java
@@ -28,16 +28,20 @@ import org.eclipse.swt.graphics.RGB;
import org.geotools.coverage.grid.GeneralGridGeometry;
import org.geotools.geometry.DirectPosition2D;
import org.geotools.geometry.jts.JTS;
+import org.opengis.coverage.grid.GridEnvelope;
import org.opengis.referencing.operation.MathTransform;
-import com.raytheon.uf.common.datastorage.records.FloatDataRecord;
-import com.raytheon.uf.common.datastorage.records.IDataRecord;
import com.raytheon.uf.common.geospatial.MapUtil;
+import com.raytheon.uf.common.geospatial.interpolation.data.DataCopy;
+import com.raytheon.uf.common.geospatial.interpolation.data.DataSource;
+import com.raytheon.uf.common.geospatial.interpolation.data.FloatArrayWrapper;
import com.raytheon.uf.common.style.contour.ContourPreferences;
+import com.raytheon.uf.common.wxmath.Constants;
import com.raytheon.uf.common.wxmath.DistFilter;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.IGraphicsTarget.LineStyle;
import com.raytheon.uf.viz.core.PixelExtent;
+import com.raytheon.uf.viz.core.datastructure.LoopProperties;
import com.raytheon.uf.viz.core.drawables.IFont;
import com.raytheon.uf.viz.core.drawables.IFont.Style;
import com.raytheon.uf.viz.core.drawables.IRenderable;
@@ -56,11 +60,13 @@ import com.vividsolutions.jts.geom.Coordinate;
*
*
* SOFTWARE HISTORY
- * Date Ticket# Engineer Description
- * ------------ ---------- ----------- --------------------------
- * Jul 10, 2008 #1233 chammack Initial creation
- * Jul 18, 2013 #2199 mschenke Made code only smooth data once
- * Aug 23, 2013 #2157 dgilling Remove meteolib dependency.
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Jul 10, 2008 1233 chammack Initial creation
+ * Jul 18, 2013 2199 mschenke Made code only smooth data once
+ * Aug 23, 2013 2157 dgilling Remove meteolib dependency.
+ * Feb 27, 2014 2791 bsteffen Switch from IDataRecord to DataSource and
+ * reduce loop freezing.
*
*
*
@@ -88,7 +94,7 @@ public abstract class ContourRenderable implements IRenderable {
private final String uuid;
- private IDataRecord[] data;
+ private DataSource[] data;
// This is the width of CONUS
private static final double METERS_AT_BASE_ZOOMLEVEL = 5878649.0;
@@ -99,7 +105,7 @@ public abstract class ContourRenderable implements IRenderable {
private static final int NUMBER_CONTOURING_LEVELS = 10;
- public abstract IDataRecord[] getData() throws VizException;
+ public abstract DataSource[] getData() throws VizException;
public abstract GeneralGridGeometry getGridGeometry() throws VizException;
@@ -124,7 +130,7 @@ public abstract class ContourRenderable implements IRenderable {
this.requestMap = new HashMap();
}
- private IDataRecord[] getContourData() throws VizException {
+ private DataSource[] getContourData() throws VizException {
if (data == null) {
data = getData();
if (data != null) {
@@ -280,7 +286,7 @@ public abstract class ContourRenderable implements IRenderable {
return;
}
- IDataRecord[] dataRecord = getContourData();
+ DataSource[] dataRecord = getContourData();
if (dataRecord == null) {
return;
}
@@ -317,25 +323,38 @@ public abstract class ContourRenderable implements IRenderable {
}
int retries = 0;
+ LoopProperties loopProps = paintProps
+ .getLoopProperties();
+ if (loopProps != null && loopProps
+ .isLooping()) {
+ /**
+ * If the display is looping, wait a few ms to
+ * let contouring finish so that if the
+ * contouring is fast enough the user is not
+ * presented with empty frames. If too many
+ * resources do this, it freezes the UI so scale
+ * the sleep time based off the number of
+ * resources because empty frames are better
+ * than freezing. This scaling also gives
+ * everyone a chance to queue up work so that
+ * multiprocessing is done more efficiently.
+ */
+ retries = 100 / descriptor.getResourceList()
+ .size();
+ }
do {
// grab request from map
request = requestMap.get(identifier);
cg = request.getContourGroup();
+ retries--;
try {
- if (cg == null
- && paintProps.getLoopProperties() != null
- && paintProps.getLoopProperties()
- .isLooping()) {
- Thread.sleep(50);
+ if (cg == null && retries > 0) {
+ Thread.sleep(10);
}
} catch (InterruptedException e) {
- // ignore
+ retries = 0;
}
- retries++;
- } while (cg == null
- && paintProps.getLoopProperties() != null
- && paintProps.getLoopProperties()
- .isLooping() && retries < 10);
+ } while (cg == null && retries > 0);
if (cg != null) {
if (cg != contourGroup[i]) {
@@ -396,7 +415,7 @@ public abstract class ContourRenderable implements IRenderable {
}
}
- private IDataRecord[] smoothData(IDataRecord[] dataRecord,
+ private DataSource[] smoothData(DataSource[] dataRecord,
GeneralGridGeometry gridGeometry, ContourPreferences contourPrefs)
throws VizException {
if (contourPrefs != null && contourPrefs.getSmoothingDistance() != null) {
@@ -424,32 +443,23 @@ public abstract class ContourRenderable implements IRenderable {
} catch (Exception e) {
throw new VizException(e);
}
- // Calculate the Dagnol Distance in Points
- FloatDataRecord rec = (FloatDataRecord) dataRecord[0];
- float[] data = rec.getFloatData();
- int nx = (int) rec.getSizes()[0];
- int ny = (int) rec.getSizes()[1];
+ // Calculate the Diagnol Distance in Points
+ GridEnvelope range = gridGeometry.getGridRange();
+ int nx = range.getSpan(0);
+ int ny = range.getSpan(1);
double distanceInPoints = Math.sqrt(nx * nx + ny * ny);
// Determine the number of points to smooth, assume
// smoothingDistance is in km
float npts = (float) (distanceInPoints
* contourPrefs.getSmoothingDistance() / (distanceInM / 1000));
- // Replace our NaN with their NaN
- for (int j = 0; j < data.length; j++) {
- if (data[j] == -999999) {
- data[j] = 1.0E37f;
- }
- }
- data = DistFilter.filter(data, npts, nx, ny, 1);
- // Replace their NaN with our NaN
- for (int j = 0; j < data.length; j++) {
- if (data[j] == 1.0E37f) {
- data[j] = -999999;
- }
- }
- rec = new FloatDataRecord(rec.getName(), rec.getGroup(), data,
- rec.getDimension(), rec.getSizes());
- return new IDataRecord[] { rec };
+ FloatArrayWrapper data = new FloatArrayWrapper(gridGeometry);
+ data.setFillValue(Constants.LEGACY_NAN);
+ DataCopy.copy(dataRecord[0], data, nx, ny);
+ float[] dataArray = data.getArray();
+ dataArray = DistFilter.filter(dataArray, npts, nx, ny, 1);
+ data = new FloatArrayWrapper(dataArray, gridGeometry);
+ data.setFillValue(Constants.LEGACY_NAN);
+ return new DataSource[] {data};
} else {
return dataRecord;
}
diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourSupport.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourSupport.java
index dcb7f5fee5..5da3822025 100644
--- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourSupport.java
+++ b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/ContourSupport.java
@@ -36,21 +36,25 @@ import org.geotools.coverage.grid.GridGeometry2D;
import org.geotools.geometry.Envelope2D;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.referencing.operation.DefaultMathTransformFactory;
+import org.opengis.coverage.grid.GridEnvelope;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.datum.PixelInCell;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
-import com.raytheon.uf.common.datastorage.records.ByteDataRecord;
-import com.raytheon.uf.common.datastorage.records.FloatDataRecord;
-import com.raytheon.uf.common.datastorage.records.IDataRecord;
import com.raytheon.uf.common.geospatial.CRSCache;
import com.raytheon.uf.common.geospatial.MapUtil;
+import com.raytheon.uf.common.geospatial.interpolation.data.DataCopy;
+import com.raytheon.uf.common.geospatial.interpolation.data.DataSource;
+import com.raytheon.uf.common.geospatial.interpolation.data.FloatArrayWrapper;
+import com.raytheon.uf.common.geospatial.interpolation.data.OffsetDataSource;
+import com.raytheon.uf.common.geospatial.util.GridGeometryWrapChecker;
import com.raytheon.uf.common.geospatial.util.WorldWrapChecker;
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.style.LabelingPreferences;
+import com.raytheon.uf.common.style.contour.ContourPreferences;
import com.raytheon.uf.common.util.GridUtil;
import com.raytheon.uf.viz.core.DrawableString;
import com.raytheon.uf.viz.core.IExtent;
@@ -72,7 +76,6 @@ import com.raytheon.viz.core.contours.util.StreamLineContainer.StreamLinePoint;
import com.raytheon.viz.core.contours.util.StrmPak;
import com.raytheon.viz.core.contours.util.StrmPakConfig;
import com.raytheon.viz.core.interval.XFormFunctions;
-import com.raytheon.uf.common.style.contour.ContourPreferences;
import com.vividsolutions.jts.geom.Geometry;
/**
@@ -82,19 +85,23 @@ import com.vividsolutions.jts.geom.Geometry;
*
* SOFTWARE HISTORY
*
- * Date Ticket# Engineer Description
- * ------------ ---------- ----------- --------------------------
- * Oct 22, 2007 chammack Initial Creation.
- * May 26, 2009 #2172 chammack Use zoomLevel to calculate label spacing
- * Apr 26, 2010 #4583 rjpeter Replaced fortran fortconbuf with java port.
- * Mar 04, 2011 #7747 njensen Cached subgrid envelopes
- * Jul 09, 2012 DR14940 M.Porricelli Adjust arrow size for streamlines
- * Feb 15, 2013 1638 mschenke Moved edex.common Util functions into common Util
- * Jun 26, 2013 #1999 dgilling Replace native fortran strmpak call
- * with java port.
+ * Date Ticket# Engineer Description
+ * ------------- -------- ------------ ----------------------------------------
+ * Oct 22, 2007 chammack Initial Creation.
+ * May 26, 2009 2172 chammack Use zoomLevel to calculate label spacing
+ * Apr 26, 2010 4583 rjpeter Replaced fortran fortconbuf with java
+ * port.
+ * Mar 04, 2011 7747 njensen Cached subgrid envelopes
+ * Jul 09, 2012 14940 M.Porricelli Adjust arrow size for streamlines
+ * Feb 15, 2013 1638 mschenke Moved edex.common Util functions into
+ * common Util
+ * Jun 26, 2013 1999 dgilling Replace native fortran strmpak call
+ * with java port.
+ * Jul 18, 2013 2199 mschenke Ensured contouring is only occurring
+ * over visible area
+ * Jul 23, 2013 2157 dgilling Remove legacy stream line drawing code.
+ * Feb 27, 2014 2791 bsteffen Switch from IDataRecord to DataSource
*
- * Jul 18, 2013 2199 mschenke Ensured contouring is only occurring over visible area
- * Jul 23, 2013 #2157 dgilling Remove legacy stream line drawing code.
*
*
* @author chammack
@@ -105,6 +112,23 @@ public class ContourSupport {
private static final transient IUFStatusHandler statusHandler = UFStatus
.getHandler(ContourSupport.class);
+ /*
+ * By default contour any data source that is passed in. This is much more
+ * efficient than copying the data and allows us to contour any DataSource.
+ *
+ * The downside is that FortConBuf accesses each data point multiple times
+ * and it is possible that DataSources with lots of transformation will have
+ * poor performance. Since different sources will exhibit different behavior
+ * and it is impossible to test all sources this field provides a runtime
+ * flag to copy all the data so that slow sources will only need to access
+ * each point once at the cost of more memory and taking the time to copy.
+ * Hopefully this is just paranoia and this flag can be removed in the
+ * future. If it turns out this is necessary we will likely want to find a
+ * more fine grained approach to tuning this.
+ */
+ private static boolean copyData = Boolean.getBoolean(ContourSupport.class
+ .getPackage().getName() + ".copyData");
+
private static float smallestContourValue = GridUtil.GRID_FILL_VALUE - 1;
private static float largestContourValue = GridUtil.GRID_FILL_VALUE + 1;
@@ -206,7 +230,7 @@ public class ContourSupport {
/**
* Create contours from provided parameters
*
- * @param records
+ * @param sources
* @param level
* @param extent
* @param currentDensity
@@ -220,7 +244,7 @@ public class ContourSupport {
* @return the ContourGroup
* @throws VizException
*/
- public static ContourGroup createContours(IDataRecord[] records,
+ public static ContourGroup createContours(DataSource[] sources,
float level, IExtent extent, double currentDensity,
double currentMagnification, GeneralGridGeometry imageGridGeometry,
IGraphicsTarget target, IMapDescriptor descriptor,
@@ -297,49 +321,37 @@ public class ContourSupport {
// Step 3: Get the actual data
- if (records.length == 1 && records[0] != null) {
- IDataRecord record = records[0];
- float[] data1D = null;
- long[] sz = record.getSizes();
-
- if (record instanceof ByteDataRecord) {
-
- byte[] data1Db = ((ByteDataRecord) record).getByteData();
- data1D = new float[data1Db.length];
- for (int i = 0; i < data1D.length; i++) {
- data1D[i] = data1Db[i] & 0xFF;
- }
- } else if (record instanceof FloatDataRecord) {
- data1D = ((FloatDataRecord) record).getFloatData();
- } else {
- throw new UnsupportedOperationException(
- "Contouring is not supported for data type: "
- + record.getClass().getName());
- }
-
+ if (sources.length == 1 && sources[0] != null) {
// Step 4: Determine the subgrid, if any
+ GridEnvelope imageRange = imageGridGeometry.getGridRange();
int minX = (int) Math.floor(Math.max(env.getMinimum(0), 0));
int minY = (int) Math.floor(Math.max(env.getMinimum(1), 0));
- int maxX = (int) Math.ceil(Math.min(env.getMaximum(0), sz[0] - 1));
- int maxY = (int) Math.ceil(Math.min(env.getMaximum(1), sz[1] - 1));
-
+ int maxX = (int) Math.ceil(Math.min(env.getMaximum(0),
+ imageRange.getHigh(0)));
+ int maxY = (int) Math.ceil(Math.min(env.getMaximum(1),
+ imageRange.getHigh(1)));
int szX = (maxX - minX) + 1;
int szY = (maxY - minY) + 1;
if (szX * szY <= 0) {
return contourGroup;
}
- float[][] subgriddedData = new float[szX][szY];
+ /* Make contours continous for world wrapping grids. */
+ int wrapNumber = GridGeometryWrapChecker
+ .checkForWrapping(imageGridGeometry);
+ if (wrapNumber - 1 >= szX) {
+ szX = wrapNumber + 1;
+ }
- for (int j = 0; j < szY; j++) {
- for (int i = 0; i < szX; i++) {
- float val = data1D[((int) sz[0] * (j + minY)) + (i + minX)];
- if (Float.isNaN(val)) {
- val = GridUtil.GRID_FILL_VALUE;
- }
- subgriddedData[i][j] = val;
- }
+ DataSource subgridSource = sources[0];
+ if (minX != 0 || minY != 0) {
+ subgridSource = new OffsetDataSource(sources[0], minX, minY);
+ }
+
+ if (copyData) {
+ subgridSource = DataCopy.copy(subgridSource,
+ new FloatArrayWrapper(szX, szY), szX, szY);
}
// Use ported legacy code to determine contour interval
@@ -358,12 +370,12 @@ public class ContourSupport {
// Awips 1
config.xOffset = minX;
config.yOffset = minY;
- config.labelSpacingLine = subgriddedData.length / 3;
+ config.labelSpacingLine = szX / 3;
if (config.labelSpacingLine < 1) {
config.labelSpacingLine = 1;
}
- config.labelSpacingOverall = (int) (subgriddedData.length * 60
+ config.labelSpacingOverall = (int) (szX * 60
* currentMagnification / ((PixelExtent) extent).getWidth() + 0.5);
// If nothing provided, attempt to get approximately 50 contours
@@ -371,10 +383,13 @@ public class ContourSupport {
// TODO this is fairly inefficient to do every time.
float min = Float.POSITIVE_INFINITY;
float max = Float.NEGATIVE_INFINITY;
- for (float f : data1D) {
- if (f != GridUtil.GRID_FILL_VALUE && !Float.isNaN(f)) {
- min = Math.min(min, f);
- max = Math.max(max, f);
+ for (int j = 0; j < szY; j++) {
+ for (int i = 0; i < szX; i++) {
+ float f = (float) subgridSource.getDataValue(i, j);
+ if (!Float.isNaN(f)) {
+ min = Math.min(min, f);
+ max = Math.max(max, f);
+ }
}
}
float interval = XFormFunctions
@@ -383,12 +398,12 @@ public class ContourSupport {
true, "", 10);
config.seed = new float[] { interval };
config.mode = -50;
- contours = FortConBuf.contour(subgriddedData, config);
+ contours = FortConBuf.contour(subgridSource, szX, szY, config);
} else {
LabelingPreferences contourLabeling = prefs
.getContourLabeling();
if (contourLabeling.getLabelSpacing() > 0) {
- config.labelSpacingLine = subgriddedData.length
+ config.labelSpacingLine = szX
/ contourLabeling.getLabelSpacing();
if (config.labelSpacingLine < 1) {
config.labelSpacingLine = 1;
@@ -425,14 +440,14 @@ public class ContourSupport {
.getIncrement();
float interval;
if (contourLabeling.getNumberOfContours() > 0) {
- float minData = 1e37f;
- float maxData = -1e37f;
- for (float[] dataRow : subgriddedData) {
- for (float data : dataRow) {
- if (data < minData && data != -999999) {
- minData = data;
- } else if (data < 999998 && data > maxData) {
- maxData = data;
+ float minData = Float.POSITIVE_INFINITY;
+ float maxData = Float.NEGATIVE_INFINITY;
+ for (int j = 0; j < szY; j++) {
+ for (int i = 0; i < szX; i++) {
+ float f = (float) subgridSource.getDataValue(i, j);
+ if (!Float.isNaN(f)) {
+ minData = Math.min(minData, f);
+ maxData = Math.max(maxData, f);
}
}
}
@@ -463,7 +478,7 @@ public class ContourSupport {
config.mode = 0;
config.seed = controls;
- contours = FortConBuf.contour(subgriddedData, config);
+ contours = FortConBuf.contour(subgridSource, szX, szY, config);
} else if (prefs.getContourLabeling().getValues() != null) {
// explicit contouring values provided
@@ -497,7 +512,7 @@ public class ContourSupport {
} else {
config.mode = vals.length;
}
- contours = FortConBuf.contour(subgriddedData, config);
+ contours = FortConBuf.contour(subgridSource, szX, szY, config);
}
}
@@ -528,7 +543,7 @@ public class ContourSupport {
long tZ1 = System.currentTimeMillis();
tMinMaxAccum += tZ1 - tZ0;
- checkWorldWrapping(contours, descriptor, rastPosToLatLon);
+ correctWorldWrapping(contours, descriptor, rastPosToLatLon);
int size = contours.xyContourPoints.size();
// total coordinates
@@ -613,19 +628,9 @@ public class ContourSupport {
} catch (Throwable e) {
throw new VizException("Error postprocessing contours", e);
}
- } else if (records.length == 2) {
- float[] uW = null;
- float[] vW = null;
- long[] sz = records[0].getSizes();
-
- if (records[0] instanceof FloatDataRecord) {
- uW = ((FloatDataRecord) records[0]).getFloatData();
- vW = ((FloatDataRecord) records[1]).getFloatData();
- } else {
- throw new UnsupportedOperationException(
- "Streamlining is not supported for data type: "
- + records.getClass().getName());
- }
+ } else if (sources.length == 2) {
+ GridEnvelope range = imageGridGeometry.getGridRange();
+ long[] sz = { range.getSpan(0), range.getSpan(1) };
// Step 4: Determine the subgrid, if any
@@ -634,7 +639,8 @@ public class ContourSupport {
int maxX = (int) Math.ceil(Math.min(env.getMaximum(0), sz[0] - 1));
int maxY = (int) Math.ceil(Math.min(env.getMaximum(1), sz[1] - 1));
- makeStreamLines(uW, vW, minX, minY, maxX, maxY, sz, contourGroup,
+ makeStreamLines(sources[0], sources[1], minX, minY, maxX, maxY, sz,
+ contourGroup,
currentMagnification, zoom, contourGroup.lastDensity,
rastPosToWorldGrid);
}
@@ -645,7 +651,7 @@ public class ContourSupport {
public static GeneralEnvelope calculateSubGrid(IExtent workingExtent,
GeneralGridGeometry mapGridGeometry,
- GeneralGridGeometry imageGridGeometry) throws VizException {
+ GeneralGridGeometry imageGridGeometry) {
GeneralEnvelope env = new GeneralEnvelope(2);
try {
GridGeometry2D imageGeometry2D = GridGeometry2D
@@ -723,7 +729,6 @@ public class ContourSupport {
final double threshold1 = (200.0 / screenToPixel);
final double threshold2 = (50.0 / screenToPixel);
- long tAccum = 0;
double q1, q2, p1, p2;
for (int n = 0; n < valsArr.length; n++) {
@@ -764,11 +769,9 @@ public class ContourSupport {
}
if (!tooClose
/* || (labeledAtLeastOnce == false && n == valsArr.length - 1) */) {
- long t0 = System.currentTimeMillis();
shapeToAddTo.addLabel(label, valsArr[n]);
labelPoints.add(valsArr[n]);
lastPoint = valsArr[n];
- tAccum += (System.currentTimeMillis() - t0);
}
}
}
@@ -1087,7 +1090,13 @@ public class ContourSupport {
int maxX = (int) (sz[0] - 1);
int maxY = (int) (sz[1] - 1);
- makeStreamLines(uW, vW, minX, minY, maxX, maxY, sz, contourGroup,
+ DataSource uWSource = new FloatArrayWrapper(uW, (int) sz[0],
+ (int) sz[1]);
+ DataSource vWSource = new FloatArrayWrapper(vW, (int) sz[0],
+ (int) sz[1]);
+
+ makeStreamLines(uWSource, vWSource, minX, minY, maxX, maxY, sz,
+ contourGroup,
1, 1, contourGroup.lastDensity * 2, gridToPixel);
return contourGroup;
@@ -1099,7 +1108,7 @@ public class ContourSupport {
}
- private static void makeStreamLines(float[] uW, float[] vW, int minX,
+ private static void makeStreamLines(DataSource uW, DataSource vW, int minX,
int minY, int maxX, int maxY, long[] sz, ContourGroup contourGroup,
double currentMagnification, float zoom, double density,
MathTransform rastPosToWorldGrid) throws VizException {
@@ -1113,24 +1122,6 @@ public class ContourSupport {
int x = (int) sz[0];
int y = (int) sz[1];
- float[][] adjustedUw = new float[szX][szY];
- float[][] adjustedVw = new float[szX][szY];
- for (int j = 0; j < szY; j++) {
- for (int i = 0; i < szX; i++) {
- float uWVal = uW[(x * (j + minY)) + (i + minX)];
- if (Float.isNaN(uWVal)) {
- uWVal = GridUtil.GRID_FILL_VALUE;
- }
- adjustedUw[szX - 1 - i][j] = uWVal;
-
- float vWVal = vW[(x * (j + minY)) + (i + minX)];
- if (Float.isNaN(vWVal)) {
- vWVal = GridUtil.GRID_FILL_VALUE;
- }
- adjustedVw[szX - 1 - i][j] = vWVal;
- }
- }
-
// Use ported legacy code to determine contour interval
long t0 = System.currentTimeMillis();
@@ -1180,8 +1171,8 @@ public class ContourSupport {
StrmPakConfig config = new StrmPakConfig(arrowSize, minspc, maxspc,
-1000000f, -999998f);
- StreamLineContainer container = StrmPak.strmpak(adjustedUw, adjustedVw,
- szX, szX, szY, config);
+ StreamLineContainer container = StrmPak.strmpak(uW, vW,
+ szX, szY, config);
long t1 = System.currentTimeMillis();
System.out.println("Contouring took: " + (t1 - t0));
@@ -1351,13 +1342,30 @@ public class ContourSupport {
return rval;
}
- private static void checkWorldWrapping(ContourContainer contours,
+ /**
+ * Check the contour lines in a ContourContainer and split any lines that
+ * need to wrap over the "seam" in the display crs. If changes are needed
+ * the lines within contours are modified directly.
+ *
+ * @param contours
+ * container holding contour lines
+ * @param descriptor
+ * the discriptor for the dispaly
+ * @param rastPosToLatLon
+ * transform for converting the coordinates within contours to
+ * LatLon coordinates.
+ * @throws TransformException
+ */
+ private static void correctWorldWrapping(ContourContainer contours,
IMapDescriptor descriptor, MathTransform rastPosToLatLon)
throws TransformException {
long tZ0 = System.currentTimeMillis();
WorldWrapChecker wwc = new WorldWrapChecker(
descriptor.getGridGeometry());
+ if (!wwc.needsChecking()) {
+ return;
+ }
List splitLines = new ArrayList();
List dupValues = new ArrayList();
diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/AbstractGriddedDisplay.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/AbstractGriddedDisplay.java
index cf8b7f1262..82d3e2c742 100644
--- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/AbstractGriddedDisplay.java
+++ b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/AbstractGriddedDisplay.java
@@ -64,6 +64,7 @@ import com.vividsolutions.jts.geom.Coordinate;
* Sep 10, 2013 16257 MPorricelli Fix so that wind for global grids displays on
* mercator maps.
* Sep 23, 2013 2363 bsteffen Add more vector configuration options.
+ * Feb 27, 2014 2791 bsteffen Remove Unnecessary throws
*
*
*
@@ -432,7 +433,7 @@ public abstract class AbstractGriddedDisplay implements IRenderable {
}
- public void reproject() throws VizException {
+ public void reproject() {
initPlotLocations();
issueRefresh();
}
diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/GriddedContourDisplay.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/GriddedContourDisplay.java
index 063992d8c1..e7f0419a05 100644
--- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/GriddedContourDisplay.java
+++ b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/GriddedContourDisplay.java
@@ -24,23 +24,24 @@ import java.nio.FloatBuffer;
import org.geotools.coverage.grid.GeneralGridGeometry;
import org.geotools.coverage.grid.GridGeometry2D;
-import com.raytheon.uf.common.datastorage.records.FloatDataRecord;
-import com.raytheon.uf.common.datastorage.records.IDataRecord;
+import com.raytheon.uf.common.geospatial.interpolation.data.DataSource;
+import com.raytheon.uf.common.geospatial.interpolation.data.FloatBufferWrapper;
+import com.raytheon.uf.common.style.contour.ContourPreferences;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.map.IMapDescriptor;
import com.raytheon.viz.core.contours.ContourRenderable;
-import com.raytheon.uf.common.style.contour.ContourPreferences;
/**
- * Displays contours from GFE Grid Data
+ * Displays contours from any data source
*
* Currently implemented using the D2D contouring capability
*
*
* SOFTWARE HISTORY
- * Date Ticket# Engineer Description
- * ------------ ---------- ----------- --------------------------
- * Jul 11, 2008 #1233 chammack Initial creation
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Jul 11, 2008 1233 chammack Initial creation
+ * Feb 27, 2014 2791 bsteffen Switch from IDataRecord to DataSource
*
*
*
@@ -54,21 +55,23 @@ public class GriddedContourDisplay extends ContourRenderable {
protected GridGeometry2D gridGeometry;
- protected FloatBuffer fb;
+ protected DataSource source;
public GriddedContourDisplay(IMapDescriptor descriptor,
final GridGeometry2D gridGeometry, final FloatBuffer fb) {
+ this(descriptor, gridGeometry, new FloatBufferWrapper(fb, gridGeometry));
+ }
+
+ public GriddedContourDisplay(IMapDescriptor descriptor,
+ final GridGeometry2D gridGeometry, final DataSource source) {
super(descriptor);
this.gridGeometry = gridGeometry;
- this.fb = fb;
+ this.source = source;
}
@Override
- public IDataRecord[] getData() throws VizException {
- FloatDataRecord fdr = new FloatDataRecord("Data", "", fb.array(), 2,
- new long[] { gridGeometry.getGridRange2D().width,
- gridGeometry.getGridRange2D().height });
- return new IDataRecord[] { fdr };
+ public DataSource[] getData() throws VizException {
+ return new DataSource[] { source };
}
@Override
diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/GriddedStreamlineDisplay.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/GriddedStreamlineDisplay.java
index 77b540ebba..2a59716c40 100644
--- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/GriddedStreamlineDisplay.java
+++ b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/GriddedStreamlineDisplay.java
@@ -23,8 +23,8 @@ import java.nio.FloatBuffer;
import org.geotools.coverage.grid.GridGeometry2D;
-import com.raytheon.uf.common.datastorage.records.FloatDataRecord;
-import com.raytheon.uf.common.datastorage.records.IDataRecord;
+import com.raytheon.uf.common.geospatial.interpolation.data.DataSource;
+import com.raytheon.uf.common.geospatial.interpolation.data.FloatBufferWrapper;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.map.IMapDescriptor;
@@ -39,11 +39,12 @@ import com.raytheon.uf.viz.core.map.IMapDescriptor;
*
*
* SOFTWARE HISTORY
- * Date Ticket# Engineer Description
- * ------------ ---------- ----------- --------------------------
- * Jun 22, 2010 bsteffen Initial creation
- * Feb 07, 2011 7948 bkowal added a public method to get
- * the direction.
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Jun 22, 2010 bsteffen Initial creation
+ * Feb 07, 2011 7948 bkowal added a public method to get the
+ * direction.
+ * Feb 27, 2014 2791 bsteffen Switch from IDataRecord to DataSource
*
*
*
@@ -52,23 +53,23 @@ import com.raytheon.uf.viz.core.map.IMapDescriptor;
*/
public class GriddedStreamlineDisplay extends GriddedContourDisplay {
- private FloatBuffer vfb;
+ private DataSource vSource;
public GriddedStreamlineDisplay(IMapDescriptor descriptor,
GridGeometry2D gridGeometry, FloatBuffer ufb, FloatBuffer vfb) {
super(descriptor, gridGeometry, ufb);
- this.vfb = vfb;
+ this.vSource = new FloatBufferWrapper(vfb, gridGeometry);
+ }
+
+ public GriddedStreamlineDisplay(IMapDescriptor descriptor,
+ GridGeometry2D gridGeometry, DataSource ufb, DataSource vfb) {
+ super(descriptor, gridGeometry, ufb);
+ this.vSource = vfb;
}
@Override
- public IDataRecord[] getData() throws VizException {
- FloatDataRecord ufdr = new FloatDataRecord("uData", "", fb.array(), 2,
- new long[] { gridGeometry.getGridRange2D().width,
- gridGeometry.getGridRange2D().height });
- FloatDataRecord vfdr = new FloatDataRecord("vData", "", vfb.array(), 2,
- new long[] { gridGeometry.getGridRange2D().width,
- gridGeometry.getGridRange2D().height });
- return new IDataRecord[] { ufdr, vfdr };
+ public DataSource[] getData() throws VizException {
+ return new DataSource[] { source, vSource };
}
}
diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/PlotLocationCache.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/PlotLocationCache.java
index 7495ed6b1e..6a1d7a9193 100644
--- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/PlotLocationCache.java
+++ b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/rsc/displays/PlotLocationCache.java
@@ -34,20 +34,19 @@ import org.opengis.referencing.operation.NoninvertibleTransformException;
import org.opengis.referencing.operation.TransformException;
/**
- *
- * TODO Add Description
+ * Caches reprojected plot location for quick display.
*
*
*
* SOFTWARE HISTORY
*
- * Date Ticket# Engineer Description
- * ------------ ---------- ----------- --------------------------
- * Oct 13, 2011 bsteffen Initial creation
- * Sep 10, 2013 DR 16257 MPorricelli Eliminate values that
- * fail to be tranformed,e.g.
- * when too close to pole for
- * mercator projections
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- -----------------------------------------
+ * Oct 13, 2011 bsteffen Initial creation
+ * Sep 10, 2013 16257 MPorricelli Eliminate values that fail to be
+ * tranformed,e.g. when too close to pole
+ * for mercator projections
+ * Feb 27, 2014 2791 bsteffen Remove Unnecessary catch
*
*
*
@@ -169,8 +168,6 @@ public class PlotLocationCache {
throw new RuntimeException(e);
} catch (NoninvertibleTransformException e) {
throw new RuntimeException(e);
- } catch (TransformException e) {
- throw new RuntimeException(e);
}
cache.put(key, new SoftReference(result));
}
diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/FortConBuf.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/FortConBuf.java
index 549a347564..d57911f469 100644
--- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/FortConBuf.java
+++ b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/FortConBuf.java
@@ -24,6 +24,11 @@ import java.text.ParseException;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
+import com.raytheon.uf.common.geospatial.interpolation.data.AxisSwapDataSource;
+import com.raytheon.uf.common.geospatial.interpolation.data.DataSource;
+import com.raytheon.uf.common.geospatial.interpolation.data.FloatArray2DWrapper;
+import com.raytheon.uf.common.geospatial.interpolation.data.InvalidRangeDataSource;
+
/**
* Port of the fortCon.f routine. Minimal changes made to make it perform better
* in java. Not object orientated and not thread safe!
@@ -31,9 +36,10 @@ import java.util.concurrent.ConcurrentLinkedQueue;
*
*
* SOFTWARE HISTORY
- * Date Ticket# Engineer Description
- * ------------ ---------- ----------- --------------------------
- * Apr 22, 2010 #4583 rjpeter Initial creation
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Apr 22, 2010 4583 rjpeter Initial creation
+ * Feb 27, 2014 2791 bsteffen Use DataSource for generic data access.
*
*
*
@@ -68,13 +74,9 @@ public class FortConBuf {
}
}
- private PointBuffer ijPntBuffer = new PointBuffer(2000, 1000, true);
+ private PointBuffer ijPntBuffer = new PointBuffer(2000, 1000);
- private float[][] dataToContour;
-
- private int nx;
-
- private int ny;
+ private DataSource dataToContour;
private int nxMaxIndex;
@@ -96,16 +98,6 @@ public class FortConBuf {
private float[] MxAvg = new float[maxContours];
- private int dlx;
-
- private int dly;
-
- private int dld;
-
- private int labsep;
-
- private int celcnt;
-
private int c;
private int labsep2;
@@ -119,6 +111,34 @@ public class FortConBuf {
private static Queue instancePool = new ConcurrentLinkedQueue();
public static ContourContainer contour(float[][] data, FortConConfig config) {
+ int ny = data.length;
+ int nx = data[0].length;
+ DataSource source = new FloatArray2DWrapper(data, nx, ny);
+ source = new AxisSwapDataSource(source);
+ if (config.badlo < config.badhi) {
+ source = new InvalidRangeDataSource(source, config.badlo,
+ config.badhi);
+ }
+ return contour(source, ny, nx, config);
+ }
+
+ /**
+ * Perform contouring. This method ignores config.badlo and config.badhi and
+ * only treats NaN as bad data.
+ *
+ * @param data
+ * the source for data to contouring.
+ * @param nx
+ * The number of points to contour in the x direction
+ * @param ny
+ * The number of points to contour in the y direction
+ * @param config
+ * configuration options
+ * @return a ContourContainer
+ */
+ public static ContourContainer contour(DataSource data, int nx, int ny,
+ FortConConfig config) {
+
ContourContainer rval = null;
FortConBuf instance = null;
try {
@@ -127,7 +147,7 @@ public class FortConBuf {
instance = new FortConBuf();
}
- rval = instance.contourInternal(data, config);
+ rval = instance.contourInternal(data, nx, ny, config);
} finally {
if (instance != null) {
instancePool.add(instance);
@@ -137,141 +157,76 @@ public class FortConBuf {
return rval;
}
- private ContourContainer contourInternal(float[][] data,
+ private ContourContainer contourInternal(DataSource data, int nx, int ny,
FortConConfig config) {
dataToContour = data;
- nx = dataToContour.length;
- ny = dataToContour[0].length;
+
nxMaxIndex = nx - 1;
nyMaxIndex = ny - 1;
ijPntBuffer.setSize(0);
ijPntBuffer.setXOffset(config.xOffset);
ijPntBuffer.setYOffset(config.yOffset);
- float rawmax = -Float.MAX_VALUE;
- float rawmin = Float.MAX_VALUE;
+ double rawmax = -Double.MAX_VALUE;
+ double rawmin = Double.MAX_VALUE;
work1 = new byte[nx][ny];
work2 = new byte[nx][ny];
work3 = new byte[nx][ny];
work4 = new byte[nx][ny];
- int ldwork = Math.min(Math.min(nx, ny),
- Math.max(1, config.labelSpacingLine));
// contourCount is number of contour values
int contourCount, mmm;
int i, j, xmode, turn1, turn2, turn3, turn4, ii, jj;
- float val, val1, val2, dval, minval, maxval, D2;
- String[] LabStr = new String[maxContours];
-
+ double val, val1, val2, dval, minval, maxval, D2;
Byte bbb;
// map out missing values
- if (config.badlo < config.badhi) {
- // Figure out which vertical sides can accept contours.
- for (int cIdx = 0; cIdx < nx; cIdx++) {
- val2 = dataToContour[cIdx][nyMaxIndex];
- for (int rIdx = nyMaxIndex - 1; rIdx >= 0; rIdx--) {
- val1 = dataToContour[cIdx][rIdx];
- if (val1 < val2) {
- if (val1 > config.badhi || val2 < config.badlo) {
- if (val1 < rawmin) {
- rawmin = val1;
- }
-
- work4[cIdx][rIdx] = b40;
- } else {
- work4[cIdx][rIdx] = 1;
- }
- } else {
- if (val2 > config.badhi || val1 < config.badlo) {
- if (val2 < rawmin) {
- rawmin = val2;
- }
- if (val2 < val1) {
- work4[cIdx][rIdx] = bC0;
- }
- } else {
- work4[cIdx][rIdx] = 1;
- }
+ // Figure out which vertical sides can accept contours.
+ for (int cIdx = 0; cIdx < nx; cIdx++) {
+ val2 = dataToContour.getDataValue(cIdx, nyMaxIndex);
+ for (int rIdx = nyMaxIndex - 1; rIdx >= 0; rIdx--) {
+ val1 = dataToContour.getDataValue(cIdx, rIdx);
+ if (val1 < val2) {
+ if (val1 < rawmin) {
+ rawmin = val1;
}
- val2 = val1;
- }
- }
-
- // Figure out which horizontal sides can accept contours.
- for (int rIdx = 0; rIdx < ny; rIdx++) {
- val2 = dataToContour[nxMaxIndex][rIdx];
- for (int cIdx = nxMaxIndex - 1; cIdx >= 0; cIdx--) {
- val1 = dataToContour[cIdx][rIdx];
- if (val1 < val2) {
- if (val1 > config.badhi || val2 < config.badlo) {
- if (val2 > rawmax) {
- rawmax = val2;
- }
-
- work3[cIdx][rIdx] = b40;
- } else {
- work3[cIdx][rIdx] = 1;
- }
- } else {
- if (val2 > config.badhi || val1 < config.badlo) {
- if (val1 > rawmax) {
- rawmax = val1;
- }
- if (val2 < val1) {
- work3[cIdx][rIdx] = bC0;
- }
- } else {
- work3[cIdx][rIdx] = 1;
- }
+ work4[cIdx][rIdx] = b40;
+ } else if (Double.isNaN(val1) || Double.isNaN(val2)) {
+ work4[cIdx][rIdx] = 1;
+ } else {
+ if (val2 < rawmin) {
+ rawmin = val2;
}
- val2 = val1;
- }
- }
- } else { // no missing value
- // Determine "sense" of vertical sides.
- for (int cIdx = 0; cIdx < nx; cIdx++) {
- val2 = dataToContour[cIdx][nyMaxIndex];
- for (int rIdx = nyMaxIndex - 1; rIdx >= 0; rIdx--) {
- val1 = dataToContour[cIdx][rIdx];
- if (val1 < val2) {
- if (val1 < rawmin) {
- rawmin = val1;
- }
-
- work4[cIdx][rIdx] = b40;
- } else {
- if (val2 < rawmin) {
- rawmin = val2;
- }
-
+ if (val2 < val1) {
work4[cIdx][rIdx] = bC0;
}
- val2 = val1;
}
+ val2 = val1;
}
+ }
- // determine "sense" of horizontal size
- for (int rIdx = 0; rIdx < ny; rIdx++) {
- val2 = dataToContour[nxMaxIndex][rIdx];
- for (int cIdx = nxMaxIndex - 1; cIdx >= 0; cIdx--) {
- val1 = dataToContour[cIdx][rIdx];
- if (val1 < val2) {
- if (val2 > rawmax) {
- rawmax = val2;
- }
-
- work3[cIdx][rIdx] = b40;
- } else {
- if (val1 > rawmax) {
- rawmax = val1;
- }
-
+ // Figure out which horizontal sides can accept contours.
+ for (int rIdx = 0; rIdx < ny; rIdx++) {
+ val2 = dataToContour.getDataValue(nxMaxIndex, rIdx);
+ for (int cIdx = nxMaxIndex - 1; cIdx >= 0; cIdx--) {
+ val1 = dataToContour.getDataValue(cIdx, rIdx);
+ if (val1 < val2) {
+ if (val2 > rawmax) {
+ rawmax = val2;
+ }
+ work3[cIdx][rIdx] = b40;
+ } else if (Double.isNaN(val1) || Double.isNaN(val2)) {
+ work3[cIdx][rIdx] = 1;
+ } else {
+ if (val1 > rawmax) {
+ rawmax = val1;
+ }
+ if (val2 < val1) {
work3[cIdx][rIdx] = bC0;
}
- val2 = val1;
}
+ val2 = val1;
}
}
@@ -355,7 +310,7 @@ public class FortConBuf {
// e.g. dont calculate contours with an offset of 1.5 when
// contours are printed as integers, will cause contours
// to go missing in that case
- if (config != null && config.labelFormat != null) {
+ if (config.labelFormat != null) {
DecimalFormat df = new DecimalFormat(config.labelFormat);
float temp = Float.valueOf(df.format(dval));
if (temp != 0) {
@@ -379,7 +334,7 @@ public class FortConBuf {
int numSteps = (int) ((val2 - val1) / dval + 1);
val = val1;
for (contourCount = 0; contourCount < numSteps; contourCount++) {
- ConVal[contourCount] = val;
+ ConVal[contourCount] = (float) val;
val = val + dval;
}
// remove ncon-- as now ncon is the number of contour values
@@ -468,8 +423,8 @@ public class FortConBuf {
// mmtol processing always amount to 0
float dmm = 0;
- float mmlim1 = 0;
- float mmlim2 = 0;
+ double mmlim1 = 0;
+ double mmlim2 = 0;
// Figure out limits of values which may be marked for.
if (mmm > 1 && val2 < 0) {
@@ -496,7 +451,7 @@ public class FortConBuf {
continue MIN_MAX_SEARCH;
}
// check that this falls within markable limits
- val = dataToContour[i][j];
+ val = dataToContour.getDataValue(i, j);
if (val < mmlim1 || val > mmlim2) {
continue MIN_MAX_SEARCH;
}
@@ -508,19 +463,23 @@ public class FortConBuf {
continue MIN_MAX_SEARCH;
}
// check corner points
- if ((work3[im][jm] >= 2 && work4[im][jm] >= 2 && dataToContour[i][j] >= dataToContour[im][jm])
- || (work3[im][jp] >= 2 && work4[im][j] <= -2 && dataToContour[i][j] >= dataToContour[im][jp])
- || (work3[i][jm] <= -2 && work4[ip][jm] >= 2 && dataToContour[i][j] >= dataToContour[ip][jm])
- || (work3[i][jp] <= -2 && work4[ip][j] <= -2 && dataToContour[i][j] >= dataToContour[ip][jp])) {
+ if ((work3[im][jm] >= 2 && work4[im][jm] >= 2 && val >= dataToContour
+ .getDataValue(im, jm))
+ || (work3[im][jp] >= 2 && work4[im][j] <= -2 && val >= dataToContour
+ .getDataValue(jp, im))
+ || (work3[i][jm] <= -2 && work4[ip][jm] >= 2 && val >= dataToContour
+ .getDataValue(ip, jm))
+ || (work3[i][jp] <= -2 && work4[ip][j] <= -2 && val >= dataToContour
+ .getDataValue(ip, jp))) {
continue MIN_MAX_SEARCH;
}
// sharp min check
if (dmm > 0) {
- val = dataToContour[i][j] + dmm;
- if (val > dataToContour[im][j]
- || val > dataToContour[i][jm]
- || val > dataToContour[ip][j]
- || val > dataToContour[i][jp]) {
+ val = val + dmm;
+ if (val > dataToContour.getDataValue(im, j)
+ || val > dataToContour.getDataValue(i, jm)
+ || val > dataToContour.getDataValue(ip, j)
+ || val > dataToContour.getDataValue(i, jp)) {
continue MIN_MAX_SEARCH;
}
}
@@ -558,19 +517,23 @@ public class FortConBuf {
continue MIN_MAX_SEARCH;
}
// check corner points
- if ((work3[im][jm] <= -2 && work4[im][jm] <= -2 && dataToContour[i][j] <= dataToContour[im][jm])
- || (work3[im][jp] <= -2 && work4[im][j] >= 2 && dataToContour[i][j] <= dataToContour[im][jp])
- || (work3[i][jm] >= 2 && work4[ip][jm] <= -2 && dataToContour[i][j] <= dataToContour[ip][jm])
- || (work3[i][jp] >= 2 && work4[ip][j] >= 2 && dataToContour[i][j] <= dataToContour[ip][jp])) {
+ if ((work3[im][jm] <= -2 && work4[im][jm] <= -2 && val <= dataToContour
+ .getDataValue(im, jm))
+ || (work3[im][jp] <= -2 && work4[im][j] >= 2 && val <= dataToContour
+ .getDataValue(ip, jp))
+ || (work3[i][jm] >= 2 && work4[ip][jm] <= -2 && val <= dataToContour
+ .getDataValue(ip, jm))
+ || (work3[i][jp] >= 2 && work4[ip][j] >= 2 && val <= dataToContour
+ .getDataValue(ip, jp))) {
continue MIN_MAX_SEARCH;
}
// sharp max check
if (dmm > 0) {
- val = dataToContour[i][j] - dmm;
- if (val < dataToContour[im][j]
- || val < dataToContour[i][jm]
- || val < dataToContour[ip][j]
- || val < dataToContour[i][jp]) {
+ val = val - dmm;
+ if (val < dataToContour.getDataValue(im, j)
+ || val < dataToContour.getDataValue(i, jm)
+ || val < dataToContour.getDataValue(ip, j)
+ || val < dataToContour.getDataValue(i, jp)) {
continue MIN_MAX_SEARCH;
}
}
@@ -629,12 +592,6 @@ public class FortConBuf {
// Initialize counters for total cells, labels, and label separations on
// lines.
- // TODO account for fortran 1 index?
- dlx = 2;
- dly = 2;
- dld = 3;
- labsep = dld * ldwork;
- celcnt = labsep / 2;
labsep2 = config.labelSpacingOverall;
// Fill line pattern array, scale contour value array, and set use count
@@ -693,7 +650,7 @@ public class FortConBuf {
}
// Cell side does not have missing values, reinitialize search.
- D2 = dataToContour[i][j];
+ D2 = dataToContour.getDataValue(i, j);
if (bbb > 0) {
for (c = 0; c < contourCount; c++) {
if (ConVal[c] > D2) {
@@ -748,7 +705,7 @@ public class FortConBuf {
}
case 10022: {
// Step through possible contours we can start
- D2 = dataToContour[ii][jj];
+ D2 = dataToContour.getDataValue(ii, jj);
boolean keepProcessing = true;
while (keepProcessing) {
if (ConVal[c] < D2) {
@@ -801,7 +758,7 @@ public class FortConBuf {
}
case 10032: {
// Step through possible contours we can start
- D2 = dataToContour[ii][jj];
+ D2 = dataToContour.getDataValue(ii, jj);
boolean keepProcessing = true;
while (keepProcessing) {
if (ConVal[c] > D2) {
@@ -840,7 +797,7 @@ public class FortConBuf {
}
// Cell side does not have missing values, reinitialize search.
- D2 = dataToContour[i][j];
+ D2 = dataToContour.getDataValue(i, j);
if (bbb > 0) {
for (c = 0; c < contourCount; c++) {
if (ConVal[c] > D2) {
@@ -895,7 +852,7 @@ public class FortConBuf {
}
case 20022: {
// Step through possible contours we can start
- D2 = dataToContour[ii][jj];
+ D2 = dataToContour.getDataValue(ii, jj);
boolean keepProcessing = true;
while (keepProcessing) {
if (ConVal[c] < D2) {
@@ -948,7 +905,7 @@ public class FortConBuf {
}
case 20032: {
// Find group of contours which are bracketed
- D2 = dataToContour[ii][jj];
+ D2 = dataToContour.getDataValue(ii, jj);
boolean keepProcessing = true;
while (keepProcessing) {
if (ConVal[c] > D2) {
@@ -987,7 +944,7 @@ public class FortConBuf {
}
// Cell side does not have missing values, reinitialize search.
- D2 = dataToContour[i][j];
+ D2 = dataToContour.getDataValue(i, j);
if (bbb < 0) {
for (c = 0; c < contourCount; c++) {
if (ConVal[c] > D2) {
@@ -1042,7 +999,7 @@ public class FortConBuf {
}
case 30022: {
// Step through possible contours we can start
- D2 = dataToContour[ii][jj];
+ D2 = dataToContour.getDataValue(ii, jj);
boolean keepProcessing = true;
while (keepProcessing) {
if (ConVal[c] < D2) {
@@ -1095,7 +1052,7 @@ public class FortConBuf {
}
case 30032: {
// Step through possible contours we can start
- D2 = dataToContour[ii][jj];
+ D2 = dataToContour.getDataValue(ii, jj);
boolean keepProcessing = true;
while (keepProcessing) {
if (ConVal[c] > D2) {
@@ -1134,7 +1091,7 @@ public class FortConBuf {
}
// Cell side does not have missing values, reinitialize search.
- D2 = dataToContour[i][j];
+ D2 = dataToContour.getDataValue(i, j);
if (bbb < 0) {
for (c = 0; c < contourCount; c++) {
if (ConVal[c] > D2) {
@@ -1189,7 +1146,7 @@ public class FortConBuf {
}
case 40022: {
// Step through possible contours we can start
- D2 = dataToContour[ii][jj];
+ D2 = dataToContour.getDataValue(ii, jj);
boolean keepProcessing = true;
while (keepProcessing) {
if (ConVal[c] < D2) {
@@ -1242,7 +1199,7 @@ public class FortConBuf {
}
case 40032: {
// Step through possible contours we can start
- D2 = dataToContour[ii][jj];
+ D2 = dataToContour.getDataValue(ii, jj);
boolean keepProcessing = true;
while (keepProcessing) {
if (ConVal[c] > D2) {
@@ -1276,12 +1233,14 @@ public class FortConBuf {
bbb = work3[i][j];
if (bbb == b52) {
// minima
- rval.minVals.add(dataToContour[i][j]);
+ rval.minVals.add((float) dataToContour.getDataValue(i,
+ j));
rval.minLabelPoints.add(new float[] {
i + config.xOffset, j + config.yOffset });
} else if (bbb == bD2) {
// maxima
- rval.maxVals.add(dataToContour[i][j]);
+ rval.maxVals.add((float) dataToContour.getDataValue(i,
+ j));
rval.maxLabelPoints.add(new float[] {
i + config.xOffset, j + config.yOffset });
}
@@ -1341,8 +1300,6 @@ public class FortConBuf {
// | |
// point 1 (i,j)-------side 1------(i+1,j) point 2
float val = ConVal[c];
- float minavg = MnAvg[c];
- float maxavg = MxAvg[c];
byte cmw = CMask[c];
boolean GGG1 = false;
boolean GGG2 = false;
@@ -1363,7 +1320,6 @@ public class FortConBuf {
float D2 = 0;
float D3 = 0;
float D4 = 0;
- float DDQ = 0;
// reset point buffer
ijPntBuffer.setSize(0);
@@ -1400,8 +1356,8 @@ public class FortConBuf {
icell = istart;
iplus = istart + 1;
clos1 = true;
- D3 = dataToContour[iplus][jcell];
- D4 = dataToContour[icell][jcell];
+ D3 = (float) dataToContour.getDataValue(iplus, jcell);
+ D4 = (float) dataToContour.getDataValue(icell, jcell);
GGG3 = val >= D3;
GGG4 = val >= D4;
if (GGG3 == GGG4) {
@@ -1427,8 +1383,8 @@ public class FortConBuf {
jcell = jstart;
jplus = jstart + 1;
clos2 = true;
- D1 = dataToContour[iplus][jcell];
- D4 = dataToContour[iplus][jplus];
+ D1 = (float) dataToContour.getDataValue(iplus, jcell);
+ D4 = (float) dataToContour.getDataValue(iplus, jplus);
GGG1 = val >= D1;
GGG4 = val >= D4;
if (GGG1 == GGG4) {
@@ -1454,8 +1410,8 @@ public class FortConBuf {
icell = istart;
iplus = istart + 1;
clos3 = true;
- D1 = dataToContour[icell][jplus];
- D2 = dataToContour[iplus][jplus];
+ D1 = (float) dataToContour.getDataValue(icell, jplus);
+ D2 = (float) dataToContour.getDataValue(iplus, jplus);
GGG1 = val >= D1;
GGG2 = val >= D2;
if (GGG1 == GGG2) {
@@ -1481,8 +1437,8 @@ public class FortConBuf {
jcell = jstart;
jplus = jstart + 1;
clos4 = true;
- D3 = dataToContour[icell][jplus];
- D2 = dataToContour[icell][jcell];
+ D3 = (float) dataToContour.getDataValue(icell, jplus);
+ D2 = (float) dataToContour.getDataValue(icell, jcell);
GGG3 = val >= D3;
GGG2 = val >= D2;
if (GGG3 == GGG2) {
@@ -1501,8 +1457,8 @@ public class FortConBuf {
D1 = D4;
GGG2 = GGG3;
D2 = D3;
- D3 = dataToContour[iplus][jplus];
- D4 = dataToContour[icell][jplus];
+ D3 = (float) dataToContour.getDataValue(iplus, jplus);
+ D4 = (float) dataToContour.getDataValue(icell, jplus);
GGG3 = val >= D3;
GGG4 = val >= D4;
@@ -1513,7 +1469,6 @@ public class FortConBuf {
jumpLabel = 9000;
continue JUMP_LOOP;
}
- celcnt += dld;
jumpLabel = 4422;
continue JUMP_LOOP;
} else if ((work4[iplus][jcell] & 1) == 0) {
@@ -1521,7 +1476,6 @@ public class FortConBuf {
jumpLabel = 9000;
continue JUMP_LOOP;
}
- celcnt += dld;
jumpLabel = 2244;
continue JUMP_LOOP;
}
@@ -1531,7 +1485,6 @@ public class FortConBuf {
// Determine proper path through cell from side one
if (GGG3 == GGG4) {
- celcnt += dld;
if (GGG2 == GGG3) {
jumpLabel = 4422;
continue JUMP_LOOP;
@@ -1540,11 +1493,9 @@ public class FortConBuf {
continue JUMP_LOOP;
} else {
if (GGG1 == GGG4) {
- celcnt += dly;
jumpLabel = 3311;
continue JUMP_LOOP;
}
- celcnt += dld;
GGGD = val4 >= (D1 + D2 + D3 + D4);
if (GGG1 != GGGD) {
jumpLabel = 4422;
@@ -1560,8 +1511,8 @@ public class FortConBuf {
D2 = D1;
GGG3 = GGG4;
D3 = D4;
- D1 = dataToContour[icell][jcell];
- D4 = dataToContour[icell][jplus];
+ D1 = (float) dataToContour.getDataValue(icell, jcell);
+ D4 = (float) dataToContour.getDataValue(icell, jplus);
GGG1 = val >= D1;
GGG4 = val >= D4;
@@ -1572,7 +1523,6 @@ public class FortConBuf {
jumpLabel = 9000;
continue JUMP_LOOP;
}
- celcnt += dld;
jumpLabel = 3311;
continue JUMP_LOOP;
} else if ((work3[icell][jcell] & 1) == 0) {
@@ -1580,7 +1530,6 @@ public class FortConBuf {
jumpLabel = 9000;
continue JUMP_LOOP;
}
- celcnt += dld;
jumpLabel = 1133;
continue JUMP_LOOP;
}
@@ -1590,7 +1539,6 @@ public class FortConBuf {
// Determine proper path through cell from side two.
if (GGG1 == GGG4) {
- celcnt += dld;
if (GGG3 == GGG4) {
jumpLabel = 1133;
continue JUMP_LOOP;
@@ -1599,11 +1547,9 @@ public class FortConBuf {
continue JUMP_LOOP;
} else {
if (GGG1 == GGG2) {
- celcnt += dlx;
jumpLabel = 4422;
continue JUMP_LOOP;
}
- celcnt += dld;
GGGD = val4 >= (D1 + D2 + D3 + D4);
if (GGG2 != GGGD) {
jumpLabel = 1133;
@@ -1619,8 +1565,8 @@ public class FortConBuf {
D3 = D2;
GGG4 = GGG1;
D4 = D1;
- D1 = dataToContour[icell][jcell];
- D2 = dataToContour[iplus][jcell];
+ D1 = (float) dataToContour.getDataValue(icell, jcell);
+ D2 = (float) dataToContour.getDataValue(iplus, jcell);
GGG1 = val >= D1;
GGG2 = val >= D2;
@@ -1631,7 +1577,6 @@ public class FortConBuf {
jumpLabel = 9000;
continue JUMP_LOOP;
}
- celcnt += dld;
jumpLabel = 2244;
continue JUMP_LOOP;
} else if ((work4[icell][jcell] & 1) == 0) {
@@ -1639,7 +1584,6 @@ public class FortConBuf {
jumpLabel = 9000;
continue JUMP_LOOP;
}
- celcnt += dld;
jumpLabel = 4422;
continue JUMP_LOOP;
}
@@ -1649,7 +1593,6 @@ public class FortConBuf {
// Determine proper path through cell from side three
if (GGG1 == GGG2) {
- celcnt += dld;
if (GGG1 == GGG4) {
jumpLabel = 2244;
continue JUMP_LOOP;
@@ -1658,11 +1601,9 @@ public class FortConBuf {
continue JUMP_LOOP;
} else {
if (GGG2 == GGG3) {
- celcnt += dly;
jumpLabel = 1133;
continue JUMP_LOOP;
}
- celcnt += dld;
GGGD = val4 >= (D1 + D2 + D3 + D4);
if (GGG3 != GGGD) {
jumpLabel = 2244;
@@ -1678,8 +1619,8 @@ public class FortConBuf {
D4 = D3;
GGG1 = GGG2;
D1 = D2;
- D3 = dataToContour[iplus][jplus];
- D2 = dataToContour[iplus][jcell];
+ D3 = (float) dataToContour.getDataValue(iplus, jplus);
+ D2 = (float) dataToContour.getDataValue(iplus, jcell);
GGG3 = val >= D3;
GGG2 = val >= D2;
@@ -1690,7 +1631,6 @@ public class FortConBuf {
jumpLabel = 9000;
continue JUMP_LOOP;
}
- celcnt += dld;
jumpLabel = 1133;
continue JUMP_LOOP;
} else if ((work3[icell][jplus] & 1) == 0) {
@@ -1698,7 +1638,6 @@ public class FortConBuf {
jumpLabel = 9000;
continue JUMP_LOOP;
}
- celcnt += dld;
jumpLabel = 3311;
continue JUMP_LOOP;
}
@@ -1708,7 +1647,6 @@ public class FortConBuf {
// Determine proper path through cell from side four.
if (GGG2 == GGG3) {
- celcnt += dld;
if (GGG1 == GGG2) {
jumpLabel = 3311;
continue JUMP_LOOP;
@@ -1717,11 +1655,9 @@ public class FortConBuf {
continue JUMP_LOOP;
} else {
if (GGG3 == GGG4) {
- celcnt += dlx;
jumpLabel = 2244;
continue JUMP_LOOP;
}
- celcnt += dld;
GGGD = val4 >= (D1 + D2 + D3 + D4);
if (GGG4 != GGGD) {
jumpLabel = 3311;
@@ -1866,150 +1802,6 @@ public class FortConBuf {
}
}
- private void markHrz(byte[][] workH, byte[][] workV, int i, int j) {
- markCheck(workH, i, j);
- if (labsep2 <= 0)
- return;
-
- markCheck(workV, i, j - 1);
- markCheck(workV, i + 1, j - 1);
- markCheck(workV, i, j);
- markCheck(workV, i + 1, j);
-
- markCheck(workH, i - 1, j);
- markCheck(workH, i + 1, j);
- if (labsep2 <= 1)
- return;
-
- markCheck(workV, i, j - 2);
- markCheck(workV, i + 1, j - 2);
- markCheck(workV, i - 1, j - 1);
- markCheck(workV, i + 2, j - 1);
- markCheck(workV, i - 1, j);
- markCheck(workV, i + 2, j);
- markCheck(workV, i, j + 1);
- markCheck(workV, i + 1, j + 1);
-
- markCheck(workH, i - 1, j - 1);
- markCheck(workH, i, j - 1);
- markCheck(workH, i + 1, j - 1);
- markCheck(workH, i - 2, j);
- markCheck(workH, i + 2, j);
- markCheck(workH, i - 1, j + 1);
- markCheck(workH, i, j + 1);
- markCheck(workH, i + 1, j + 1);
- if (labsep2 <= 2)
- return;
-
- markCheck(workV, i, j - 3);
- markCheck(workV, i + 1, j - 3);
- markCheck(workV, i - 1, j - 2);
- markCheck(workV, i + 2, j - 2);
- markCheck(workV, i - 2, j - 1);
- markCheck(workV, i + 3, j - 1);
- markCheck(workV, i - 2, j);
- markCheck(workV, i + 3, j);
- markCheck(workV, i - 1, j + 1);
- markCheck(workV, i + 2, j + 1);
- markCheck(workV, i, j + 2);
- markCheck(workV, i + 1, j + 2);
-
- markCheck(workH, i - 1, j - 2);
- markCheck(workH, i, j - 2);
- markCheck(workH, i + 1, j - 2);
- markCheck(workH, i - 2, j - 1);
- markCheck(workH, i + 2, j - 1);
- markCheck(workH, i - 3, j);
- markCheck(workH, i + 3, j);
- markCheck(workH, i - 2, j + 1);
- markCheck(workH, i + 2, j + 1);
- markCheck(workH, i - 1, j + 2);
- markCheck(workH, i, j + 2);
- markCheck(workH, i + 1, j + 2);
- if (labsep2 <= 3)
- return;
-
- markCheck(workV, i, j - 4);
- markCheck(workV, i + 1, j - 4);
- markCheck(workV, i - 1, j - 3);
- markCheck(workV, i + 2, j - 3);
- markCheck(workV, i - 2, j - 2);
- markCheck(workV, i + 3, j - 2);
- markCheck(workV, i - 3, j - 1);
- markCheck(workV, i + 4, j - 1);
- markCheck(workV, i - 3, j);
- markCheck(workV, i + 4, j);
- markCheck(workV, i - 2, j + 1);
- markCheck(workV, i + 3, j + 1);
- markCheck(workV, i - 1, j + 2);
- markCheck(workV, i + 2, j + 2);
- markCheck(workV, i, j + 3);
- markCheck(workV, i + 1, j + 3);
-
- markCheck(workH, i - 1, j - 3);
- markCheck(workH, i, j - 3);
- markCheck(workH, i + 1, j - 3);
- markCheck(workH, i - 2, j - 2);
- markCheck(workH, i + 2, j - 2);
- markCheck(workH, i - 3, j - 1);
- markCheck(workH, i + 3, j - 1);
- markCheck(workH, i - 4, j);
- markCheck(workH, i + 4, j);
- markCheck(workH, i - 3, j + 1);
- markCheck(workH, i + 3, j + 1);
- markCheck(workH, i - 2, j + 2);
- markCheck(workH, i + 2, j + 2);
- markCheck(workH, i - 1, j + 3);
- markCheck(workH, i, j + 3);
- markCheck(workH, i + 1, j + 3);
- if (labsep2 <= 4)
- return;
-
- markCheck(workV, i, j - 5);
- markCheck(workV, i + 1, j - 5);
- markCheck(workV, i - 1, j - 4);
- markCheck(workV, i + 2, j - 4);
- markCheck(workV, i - 2, j - 3);
- markCheck(workV, i + 3, j - 3);
- markCheck(workV, i - 3, j - 2);
- markCheck(workV, i + 4, j - 2);
- markCheck(workV, i - 4, j - 1);
- markCheck(workV, i + 5, j - 1);
- markCheck(workV, i - 4, j);
- markCheck(workV, i + 5, j);
- markCheck(workV, i - 3, j + 1);
- markCheck(workV, i + 4, j + 1);
- markCheck(workV, i - 2, j + 2);
- markCheck(workV, i + 3, j + 2);
- markCheck(workV, i - 1, j + 3);
- markCheck(workV, i + 2, j + 3);
- markCheck(workV, i, j + 4);
- markCheck(workV, i + 1, j + 4);
-
- markCheck(workH, i - 1, j - 4);
- markCheck(workH, i, j - 4);
- markCheck(workH, i + 1, j - 4);
- markCheck(workH, i - 2, j - 3);
- markCheck(workH, i + 2, j - 3);
- markCheck(workH, i - 3, j - 2);
- markCheck(workH, i + 3, j - 2);
- markCheck(workH, i - 4, j - 1);
- markCheck(workH, i + 4, j - 1);
- markCheck(workH, i - 5, j);
- markCheck(workH, i + 5, j);
- markCheck(workH, i - 4, j + 1);
- markCheck(workH, i + 4, j + 1);
- markCheck(workH, i - 3, j + 2);
- markCheck(workH, i + 3, j + 2);
- markCheck(workH, i - 2, j + 3);
- markCheck(workH, i + 2, j + 3);
- markCheck(workH, i - 1, j + 4);
- markCheck(workH, i, j + 4);
- markCheck(workH, i + 1, j + 4);
- if (labsep2 <= 5)
- return;
- }
-
private void markVrt(byte[][] workH, byte[][] workV, int i, int j) {
markCheck(workV, i, j);
if (labsep2 <= 0)
diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/PointBuffer.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/PointBuffer.java
index d18f85daea..5db5b0dde0 100644
--- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/PointBuffer.java
+++ b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/PointBuffer.java
@@ -25,9 +25,10 @@ package com.raytheon.viz.core.contours.util;
*
*
* SOFTWARE HISTORY
- * Date Ticket# Engineer Description
- * ------------ ---------- ----------- --------------------------
- * Apr 23, 2010 #4583 rjpeter Initial creation
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Apr 23, 2010 4583 rjpeter Initial creation
+ * Feb 27, 2014 2791 bsteffen Remove unused constructor arg
*
*
*
@@ -59,7 +60,7 @@ public class PointBuffer {
* @param initialIndex
* @param forwardDirection
*/
- public PointBuffer(int capacity, int initialIndex, boolean forwardDirection) {
+ public PointBuffer(int capacity, int initialIndex) {
buffer = new float[capacity * 2];
minIndex = initialIndex;
index = initialIndex;
diff --git a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/StrmPak.java b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/StrmPak.java
index 6714a84180..75ad12b3f2 100644
--- a/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/StrmPak.java
+++ b/cave/com.raytheon.viz.core.contours/src/com/raytheon/viz/core/contours/util/StrmPak.java
@@ -24,6 +24,9 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import com.raytheon.uf.common.geospatial.interpolation.data.AxisSwapDataSource;
+import com.raytheon.uf.common.geospatial.interpolation.data.DataSource;
+import com.raytheon.uf.common.geospatial.interpolation.data.FloatArray2DWrapper;
import com.raytheon.viz.core.contours.util.StreamLineContainer.StreamLinePoint;
/**
@@ -35,9 +38,10 @@ import com.raytheon.viz.core.contours.util.StreamLineContainer.StreamLinePoint;
*
* SOFTWARE HISTORY
*
- * Date Ticket# Engineer Description
- * ------------ ---------- ----------- --------------------------
- * Jun 10, 2013 #1999 dgilling Initial creation
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Jun 10, 2013 1999 dgilling Initial creation
+ * Feb 27, 2014 2791 bsteffen Use DataSource for generic data access.
*
*
*
@@ -126,11 +130,52 @@ public final class StrmPak {
private final PointValueBuffer JPnt;
+ /**
+ * Generate streamlines using column major float data.
+ *
+ * @param uComp
+ * data values for the u component of the vector
+ * @param vComp
+ * data values for the v component of the vector
+ * @param xSize
+ * unused
+ * @param nx
+ * number of x coordinates
+ * @param ny
+ * number of y coordinates
+ * @param config
+ * configuration options
+ * @return
+ */
public static StreamLineContainer strmpak(float[][] uComp, float[][] vComp,
int xSize, int nx, int ny, StrmPakConfig config) {
+ DataSource uSource = new FloatArray2DWrapper(uComp, ny, nx);
+ DataSource vSource = new FloatArray2DWrapper(vComp, ny, nx);
+ uSource = new AxisSwapDataSource(uSource);
+ vSource = new AxisSwapDataSource(vSource);
+ return strmpak(uSource, vSource, nx, ny, config);
+ }
+
+ /**
+ * Generate streamlines using any data source.
+ *
+ * @param uComp
+ * data values for the u component of the vector
+ * @param vComp
+ * data values for the v component of the vector
+ * @param nx
+ * number of x coordinates
+ * @param ny
+ * number of y coordinates
+ * @param config
+ * configuration options
+ * @return
+ */
+ public static StreamLineContainer strmpak(DataSource uComp,
+ DataSource vComp, int nx, int ny, StrmPakConfig config) {
StrmPak instance = new StrmPak();
- StreamLineContainer rval = instance.strmpakInternal(uComp, vComp,
- xSize, nx, ny, config);
+ StreamLineContainer rval = instance.strmpakInternal(uComp, vComp, nx,
+ ny, config);
return rval;
}
@@ -150,8 +195,6 @@ public final class StrmPak {
* Array of U components
* @param V
* Array of V components
- * @param mnx
- * First dimension of data arrays.
* @param nx
* Inner dimension of grid.
* @param ny
@@ -163,8 +206,8 @@ public final class StrmPak {
* the stream lines. Line segments will be divided by the sentinel
* value (-99999, -99999).
*/
- private StreamLineContainer strmpakInternal(float[][] U, float[][] V,
- int mnx, int nx, int ny, StrmPakConfig config) {
+ private StreamLineContainer strmpakInternal(DataSource U, DataSource V,
+ int nx, int ny, StrmPakConfig config) {
StreamLineContainer rVal = new StreamLineContainer();
// Initialize environment of streamline output.
@@ -189,14 +232,22 @@ public final class StrmPak {
for (int j = jll; j <= jum; j++) {
int jj = j + 1;
- if ((!((U[i][j] < config.badlo) || U[i][j] > config.badhi))
- || (!((U[i][jj] < config.badlo) || U[i][jj] > config.badhi))
- || (!((U[ii][j] < config.badlo) || U[ii][j] > config.badhi))
- || (!((U[ii][jj] < config.badlo) || U[ii][jj] > config.badhi))
- || (!((V[i][j] < config.badlo) || V[i][j] > config.badhi))
- || (!((V[i][jj] < config.badlo) || V[i][jj] > config.badhi))
- || (!((V[ii][j] < config.badlo) || V[ii][j] > config.badhi))
- || (!((V[ii][jj] < config.badlo) || V[ii][jj] > config.badhi))) {
+ if ((!((U.getDataValue(i, j) < config.badlo) || U.getDataValue(
+ i, j) > config.badhi))
+ || (!((U.getDataValue(i, jj) < config.badlo) || U
+ .getDataValue(i, jj) > config.badhi))
+ || (!((U.getDataValue(ii, j) < config.badlo) || U
+ .getDataValue(ii, j) > config.badhi))
+ || (!((U.getDataValue(ii, jj) < config.badlo) || U
+ .getDataValue(ii, jj) > config.badhi))
+ || (!((V.getDataValue(i, j) < config.badlo) || V
+ .getDataValue(i, j) > config.badhi))
+ || (!((V.getDataValue(i, jj) < config.badlo) || V
+ .getDataValue(i, jj) > config.badhi))
+ || (!((V.getDataValue(ii, j) < config.badlo) || V
+ .getDataValue(ii, j) > config.badhi))
+ || (!((V.getDataValue(ii, jj) < config.badlo) || V
+ .getDataValue(ii, jj) > config.badhi))) {
Work[0][i][j] = -1;
Work[1][i][j] = -1;
continue;
@@ -205,19 +256,23 @@ public final class StrmPak {
if ((minmag <= 0.0f) && (maxmag >= config.badlo)) {
continue;
}
- float mag2 = U[i][j] * U[i][j] + V[i][j] * V[i][j];
+ double mag2 = U.getDataValue(i, j) * U.getDataValue(i, j)
+ + V.getDataValue(i, j) * V.getDataValue(i, j);
if ((mag2 >= minmag2) && (mag2 <= maxmag2)) {
continue;
}
- mag2 = U[ii][j] * U[ii][j] + V[ii][j] * V[ii][j];
+ mag2 = U.getDataValue(ii, j) * U.getDataValue(ii, j)
+ + V.getDataValue(ii, j) * V.getDataValue(ii, j);
if ((mag2 >= minmag2) && (mag2 <= maxmag2)) {
continue;
}
- mag2 = U[i][jj] * U[i][jj] + V[i][jj] * V[i][jj];
+ mag2 = U.getDataValue(i, jj) * U.getDataValue(i, jj)
+ + V.getDataValue(i, jj) * V.getDataValue(i, jj);
if ((mag2 >= minmag2) && (mag2 <= maxmag2)) {
continue;
}
- mag2 = U[ii][jj] * U[ii][jj] + V[ii][jj] * V[ii][jj];
+ mag2 = U.getDataValue(ii, jj) * U.getDataValue(ii, jj)
+ + V.getDataValue(ii, jj) * V.getDataValue(ii, jj);
if ((mag2 >= minmag2) && (mag2 <= maxmag2)) {
continue;
}
@@ -250,8 +305,8 @@ public final class StrmPak {
float rj0 = j1;
for (int i = i1; i <= i2 - 1; i += k) {
float ri0 = i + 0.5f;
- StrmLin(U, V, Work, mnx, ri0, rj0, config.minspc,
- mymax, rVal);
+ StrmLin(U, V, Work, ri0, rj0, config.minspc, mymax,
+ rVal);
}
j1 -= k;
again = true;
@@ -261,8 +316,8 @@ public final class StrmPak {
float ri0 = i1;
for (int j = j1; j <= j2 - 1; j += k) {
float rj0 = j + 0.5f;
- StrmLin(U, V, Work, mnx, ri0, rj0, config.minspc,
- mymax, rVal);
+ StrmLin(U, V, Work, ri0, rj0, config.minspc, mymax,
+ rVal);
}
i1 -= k;
@@ -273,8 +328,8 @@ public final class StrmPak {
float rj0 = j2;
for (int i = i1; i <= i2 - 1; i += k) {
float ri0 = i + 0.5f;
- StrmLin(U, V, Work, mnx, ri0, rj0, config.minspc,
- mymax, rVal);
+ StrmLin(U, V, Work, ri0, rj0, config.minspc, mymax,
+ rVal);
}
j2 += k;
again = true;
@@ -284,8 +339,8 @@ public final class StrmPak {
float ri0 = i2;
for (int j = j1; j <= j2 - 1; j += k) {
float rj0 = j + 0.5f;
- StrmLin(U, V, Work, mnx, ri0, rj0, config.minspc,
- mymax, rVal);
+ StrmLin(U, V, Work, ri0, rj0, config.minspc, mymax,
+ rVal);
}
i2 += k;
again = true;
@@ -311,8 +366,6 @@ public final class StrmPak {
* drawn in each cell. A value of -1 designates a cell as having
* bad or missing data. 1 is for previously drawn streamlines, 2
* includes the streamline currently being drawn.
- * @param mnx
- * First dimension of array to be countoured.
* @param ri0
* X-coordinate to draw the streamline through. Coordinates are
* in array index space.
@@ -331,7 +384,7 @@ public final class StrmPak {
* StreamLineContainer
object accumulating all line
* segments necessary to draw stream lines for U and V.
*/
- private void StrmLin(float[][] U, float[][] V, byte[][][] Work, int mnx,
+ private void StrmLin(DataSource U, DataSource V, byte[][][] Work,
float ri0, float rj0, float minspc, float maxspc,
StreamLineContainer container) {
if ((ri0 < ill) || (ri0 > iur) || (rj0 < jll) || (rj0 > jur)) {
@@ -463,15 +516,19 @@ public final class StrmPak {
// Determine whether we are working with or against the
// flow.
float dirflg;
- float influx;
+ double influx;
if (side0 == 1) {
- influx = V[i][j] * (1.0f - x) + V[ii][j] * x;
+ influx = V.getDataValue(i, j) * (1.0f - x)
+ + V.getDataValue(ii, j) * x;
} else if (side0 == 2) {
- influx = -(U[ii][j] * (1.0f - y) + U[ii][jj] * y);
+ influx = -(U.getDataValue(ii, j) * (1.0f - y) + U
+ .getDataValue(ii, jj) * y);
} else if (side0 == 3) {
- influx = -(V[i][jj] * (1.0f - x) + V[ii][jj] * x);
+ influx = -(V.getDataValue(i, jj) * (1.0f - x) + V
+ .getDataValue(ii, jj) * x);
} else {
- influx = U[i][j] * (1.0f - y) + U[i][jj] * y;
+ influx = U.getDataValue(i, j) * (1.0f - y)
+ + U.getDataValue(i, jj) * y;
}
if (influx < 0.0f) {
dirflg = -1.0f;
@@ -587,11 +644,15 @@ public final class StrmPak {
// Determine flux contributions from each component.
// FIXME? in fortran Flux was a size 8 array, indexed 1
// -> 8
- float[] Flux = { Float.NaN, (-dirflg) * V[i][j],
- (-dirflg) * V[ii][j], dirflg * U[ii][j],
- dirflg * U[ii][jj], dirflg * V[ii][jj],
- dirflg * V[i][jj], (-dirflg) * U[i][jj],
- (-dirflg) * U[i][j] };
+ float[] Flux = { Float.NaN,
+ (-dirflg) * (float) V.getDataValue(i, j),
+ (-dirflg) * (float) V.getDataValue(ii, j),
+ dirflg * (float) U.getDataValue(ii, j),
+ dirflg * (float) U.getDataValue(ii, jj),
+ dirflg * (float) V.getDataValue(ii, jj),
+ dirflg * (float) V.getDataValue(i, jj),
+ (-dirflg) * (float) U.getDataValue(i, jj),
+ (-dirflg) * (float) U.getDataValue(i, j) };
// Count total number of in, out, and zero contributions
// to net flux.
@@ -711,20 +772,22 @@ public final class StrmPak {
boolean forward;
if (side0 == 1) {
curloc = x;
- forward = ((dirflg * (U[i][j] * (1.0f - x) + U[ii][j]
+ forward = ((dirflg * (U.getDataValue(i, j)
+ * (1.0f - x) + U.getDataValue(ii, j)
* x)) > 0.0f);
} else if (side0 == 2) {
curloc = 1.0f + y;
- forward = ((dirflg * (V[ii][j] * (1.0f - y) + V[ii][jj]
+ forward = ((dirflg * (V.getDataValue(ii, j)
+ * (1.0f - y) + V.getDataValue(ii, jj)
* y)) > 0.0f);
} else if (side0 == 3) {
curloc = 3.0f - x;
- forward = ((dirflg * (U[i][jj] * x + U[ii][jj]
- * (1.0f - x))) < 0.0f);
+ forward = ((dirflg * (U.getDataValue(i, jj) * x + U
+ .getDataValue(ii, jj) * (1.0f - x))) < 0.0f);
} else {
curloc = 4.0f - y;
- forward = ((dirflg * (V[i][j] * y + V[i][jj]
- * (1.0f - y))) < 0.0f);
+ forward = ((dirflg * (V.getDataValue(i, j) * y + V
+ .getDataValue(i, jj) * (1.0f - y))) < 0.0f);
}
// Determine stream function value of entry
diff --git a/edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/interpolation/data/AxisSwapDataSource.java b/edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/interpolation/data/AxisSwapDataSource.java
new file mode 100644
index 0000000000..979be4679f
--- /dev/null
+++ b/edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/interpolation/data/AxisSwapDataSource.java
@@ -0,0 +1,52 @@
+/**
+ * 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.uf.common.geospatial.interpolation.data;
+
+/**
+ * Wrapper source which swaps the X and Y axis when accessing data.
+ *
+ *
+ *
+ * SOFTWARE HISTORY
+ *
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Feb 24, 2014 2791 bsteffen Initial creation
+ *
+ *
+ *
+ * @author bsteffen
+ * @version 1.0
+ */
+
+public class AxisSwapDataSource implements DataSource {
+
+ protected final DataSource wrappedSource;
+
+ public AxisSwapDataSource(DataSource wrappedSource) {
+ this.wrappedSource = wrappedSource;
+ }
+
+ @Override
+ public double getDataValue(int x, int y) {
+ return wrappedSource.getDataValue(y, x);
+ }
+
+}
diff --git a/edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/interpolation/data/DataCopy.java b/edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/interpolation/data/DataCopy.java
new file mode 100644
index 0000000000..20af619104
--- /dev/null
+++ b/edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/interpolation/data/DataCopy.java
@@ -0,0 +1,51 @@
+/**
+ * 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.uf.common.geospatial.interpolation.data;
+
+/**
+ * Provide utility method for copying data from a {@link DataSource} to a
+ * {@link DataDestination}.
+ *
+ *
+ *
+ * SOFTWARE HISTORY
+ *
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Feb 27, 2014 2791 bsteffen Initial creation
+ *
+ *
+ *
+ * @author bsteffen
+ * @version 1.0
+ */
+
+public class DataCopy {
+
+ public static final D copy(DataSource source,
+ D destination, int nx, int ny) {
+ for (int i = 0; i < nx; i += 1) {
+ for (int j = 0; j < ny; j += 1) {
+ destination.setDataValue(source.getDataValue(i, j), i, j);
+ }
+ }
+ return destination;
+ }
+}
diff --git a/edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/interpolation/data/InvalidRangeDataSource.java b/edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/interpolation/data/InvalidRangeDataSource.java
new file mode 100644
index 0000000000..43ac423929
--- /dev/null
+++ b/edexOsgi/com.raytheon.uf.common.geospatial/src/com/raytheon/uf/common/geospatial/interpolation/data/InvalidRangeDataSource.java
@@ -0,0 +1,65 @@
+/**
+ * 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.uf.common.geospatial.interpolation.data;
+
+/**
+ * Returns NaN for all data values that are within a range that can be
+ * considered invalid.
+ *
+ *
+ *
+ * SOFTWARE HISTORY
+ *
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Feb 24, 2014 2791 bsteffen Initial creation
+ *
+ *
+ *
+ * @author bsteffen
+ * @version 1.0
+ */
+
+public class InvalidRangeDataSource implements DataSource {
+
+ protected final DataSource wrappedSource;
+
+ protected final double badlo;
+
+ protected final double badhi;
+
+ public InvalidRangeDataSource(DataSource wrappedSource, double badlo,
+ double badhi) {
+ this.wrappedSource = wrappedSource;
+ this.badlo = badlo;
+ this.badhi = badhi;
+ }
+
+
+ @Override
+ public double getDataValue(int x, int y) {
+ double val = wrappedSource.getDataValue(y, x);
+ if (val > badlo && val < badhi) {
+ val = Double.NaN;
+ }
+ return val;
+ }
+
+}
diff --git a/edexOsgi/com.raytheon.uf.common.wxmath/src/com/raytheon/uf/common/wxmath/Constants.java b/edexOsgi/com.raytheon.uf.common.wxmath/src/com/raytheon/uf/common/wxmath/Constants.java
index 6dc1109f70..c00752b18e 100644
--- a/edexOsgi/com.raytheon.uf.common.wxmath/src/com/raytheon/uf/common/wxmath/Constants.java
+++ b/edexOsgi/com.raytheon.uf.common.wxmath/src/com/raytheon/uf/common/wxmath/Constants.java
@@ -26,12 +26,13 @@ package com.raytheon.uf.common.wxmath;
*
* SOFTWARE HISTORY
*
- * Date Ticket# Engineer Description
- * ------------ ---------- ----------- --------------------------
- * Jun 06, 2013 2043 bsteffen Ported from meteolib C
- * Aug 13, 2013 2262 njensen Moved from deriv params
- * Aug 13, 2013 2262 dgilling Adding additional constants from
- * calcrh.f, hgt2pres.f, ztopsa.f, ptozsa.f
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Jun 06, 2013 2043 bsteffen Ported from meteolib C
+ * Aug 13, 2013 2262 njensen Moved from deriv params
+ * Aug 13, 2013 2262 dgilling Adding additional constants from
+ * calcrh.f, hgt2pres.f, ztopsa.f, ptozsa.f
+ * Feb 27, 2014 2791 bsteffen Move commonly used legacy NaN here.
*
*
*
@@ -95,6 +96,8 @@ public class Constants {
// from meteoLib hgt2pres.f, ztopsa.f, ptozsa.f
public static final double HGT_PRES_c2 = 14600.0;
+ public static final float LEGACY_NAN = 1e37f;
+
// Never allow this class to be directly instantiated
private Constants() {
throw new AssertionError();
diff --git a/edexOsgi/com.raytheon.uf.common.wxmath/src/com/raytheon/uf/common/wxmath/DistFilter.java b/edexOsgi/com.raytheon.uf.common.wxmath/src/com/raytheon/uf/common/wxmath/DistFilter.java
index 85b3a6a8c7..4bf2b1c31e 100644
--- a/edexOsgi/com.raytheon.uf.common.wxmath/src/com/raytheon/uf/common/wxmath/DistFilter.java
+++ b/edexOsgi/com.raytheon.uf.common.wxmath/src/com/raytheon/uf/common/wxmath/DistFilter.java
@@ -28,10 +28,11 @@ import java.util.Arrays;
*
* SOFTWARE HISTORY
*
- * Date Ticket# Engineer Description
- * ------------ ---------- ----------- --------------------------
- * Aug 10, 2011 rjpeter Initial creation
- * Aug 13, 2013 2262 njensen Moved from deriv params
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Aug 10, 2011 rjpeter Initial creation
+ * Aug 13, 2013 2262 njensen Moved from deriv params
+ * Feb 27, 2014 2791 bsteffen Move legacy NaN to constants.
*
*
*
@@ -144,7 +145,7 @@ public class DistFilter {
for (jj = dd; jj < ny; jj++, fpiMid += dnx, fpo += dnx) {
for (ii = dd; ii < nx; ii++, fpiMid++, fpo++) {
if (input[fpiMid] > 99998.0) {
- output[fpo] = 1e37f;
+ output[fpo] = Constants.LEGACY_NAN;
continue;
}
@@ -164,7 +165,7 @@ public class DistFilter {
}
if (tot < 0.95) {
- output[fpo] = 1e37f;
+ output[fpo] = Constants.LEGACY_NAN;
} else {
output[fpo] /= tot;
}
@@ -190,7 +191,7 @@ public class DistFilter {
}
if (input[fpiMid] > 99998.0) {
- output[fpo] = 1e37f;
+ output[fpo] = Constants.LEGACY_NAN;
continue;
}
@@ -211,7 +212,7 @@ public class DistFilter {
}
if (tot < 0.95) {
- output[fpo] = 1e37f;
+ output[fpo] = Constants.LEGACY_NAN;
} else {
output[fpo] /= tot;
}
diff --git a/edexOsgi/com.raytheon.uf.common.wxmath/src/com/raytheon/uf/common/wxmath/ScalelessAnalysis.java b/edexOsgi/com.raytheon.uf.common.wxmath/src/com/raytheon/uf/common/wxmath/ScalelessAnalysis.java
index 750120974e..3234a59d00 100644
--- a/edexOsgi/com.raytheon.uf.common.wxmath/src/com/raytheon/uf/common/wxmath/ScalelessAnalysis.java
+++ b/edexOsgi/com.raytheon.uf.common.wxmath/src/com/raytheon/uf/common/wxmath/ScalelessAnalysis.java
@@ -32,9 +32,10 @@ import java.util.Arrays;
*
* SOFTWARE HISTORY
*
- * Date Ticket# Engineer Description
- * ------------ ---------- ----------- --------------------------
- * Aug 13, 2013 2262 njensen Initial creation
+ * Date Ticket# Engineer Description
+ * ------------- -------- ----------- --------------------------
+ * Aug 13, 2013 2262 njensen Initial creation
+ * Feb 27, 2014 2791 bsteffen Move legacy NaN to constants.
*
*
*
@@ -191,9 +192,9 @@ public class ScalelessAnalysis {
binidx[kk] = (short) (bb * 2 - 2);
double rat;
if (ii == 0) {
- rat = (float) (jj) / 0.1;
+ rat = (jj) / 0.1;
} else if (jj == 0) {
- rat = 0.1 / (float) (ii);
+ rat = 0.1 / (ii);
} else {
rat = (float) (jj) / (float) (ii);
}
@@ -536,7 +537,7 @@ public class ScalelessAnalysis {
for (jj = sxy - 1; jj >= 0; jj--) {
int ii = 0;
for (int kk = jj * sxy; ii < sxy; ii++, kk++) {
- System.err.printf("%d ", (int) (kswath0[kk]));
+ System.err.printf("%d ", (kswath0[kk]));
}
System.err.printf("\n");
}
@@ -676,8 +677,8 @@ public class ScalelessAnalysis {
float[] grid = new float[nx * ny];
float[] raw = new float[nnd];
int[] counts = new int[nnd];
- Arrays.fill(raw, 1e37f);
- Arrays.fill(grid, 1e37f);
+ Arrays.fill(raw, Constants.LEGACY_NAN);
+ Arrays.fill(grid, Constants.LEGACY_NAN);
int raw0 = -ddd;
int counts0 = -ddd;
@@ -743,7 +744,7 @@ public class ScalelessAnalysis {
/* work arrays with info about each grid resolved observation */
float[] dists = new float[nnd];
- Arrays.fill(dists, 1e37f);
+ Arrays.fill(dists, Constants.LEGACY_NAN);
int dists0 = -ddd;
byte[] octant = new byte[nnd];
int[] nearest = new int[nnd];