Hi,
I got a NullPointerException during interpolation (with the evaluate method)
and finally found out that the error was due to a bad LowX value in my
Irregular1DSet. The problem seems to be related to the use of extreme values
(e.g. Float.MIN_VALUES, Float.MAX_VALUE) as samples for the set but doesn't
happen in a consistent manner. Please find below a small program which
illustrates the problem:
1- method test1() provides an example for which the Low value gets corrupted
2- method test2() provides a similar example but for which the Low and Hi
values are correct
3- method test3() generates the NullPointerException
The output of the program is:
Test 1: low=-1124.069 hi=3.4028235E38
aSet is visad.Irregular1DSet: Dimension = 1 Length = 4
Dimension 0: Range = -1124.069 to 3.4028235E38
Test 2: low=1.4E-45 hi=3.4028235E38
aSet is visad.Irregular1DSet: Dimension = 1 Length = 4
Dimension 0: Range = 1.4E-45 to 3.4028235E38
Test 3: interField.evaluate(-2000.0f)
java.lang.NullPointerException
at visad.Irregular1DSet.valueToInterp(Irregular1DSet.java:127)
at visad.FlatField.resample(FlatField.java:3446)
at visad.FunctionImpl.evaluate(FunctionImpl.java:169)
at visad.FunctionImpl.evaluate(FunctionImpl.java:128)
at TestIrregular1DSet.test3(TestIrregular1DSet.java:51)
at TestIrregular1DSet.main(TestIrregular1DSet.java:60)
Exception in thread "main"
Process TestIrregular1DSet exited abnormally with code 1
I got the same error with jdk1.1.3 and jdk1.1.4. I also replaced
Float.MIN_VALUE by Float.NEGATIVE_INFINITE, no luck. I'm really not
convinced that the problem is in the VisAD logic. Nevertheless, it would be
good to have a solution.
Thanks,
Sylvain
import java.rmi.RemoteException;
import visad.*;
public class TestIrregular1DSet {
public TestIrregular1DSet() {
}
public void test1() throws VisADException {
float[][] samples = new float[][] {
{Float.MIN_VALUE, -1124.06897f, -1047.077026f,
Float.MAX_VALUE}};
Irregular1DSet aSet = new Irregular1DSet(
RealType.getRealType("x1", null, null), samples);
float[] hi = aSet.getHi();
float[] low = aSet.getLow();
System.out.println("Test 1: low=" + low[0] + " hi=" + hi[0]);
System.out.println(" aSet is " + aSet.longString(" "));
}
public void test2() throws VisADException {
float[][] samples = new float[][] {
{Float.MIN_VALUE, 208.561829f, 326.168915f,
Float.MAX_VALUE}};
Irregular1DSet aSet =
new Irregular1DSet(RealType.getRealType("x2", null, null),
samples);
float[] hi = aSet.getHi();
float[] low = aSet.getLow();
System.out.println("Test 2: low=" + low[0] + " hi=" + hi[0]);
System.out.println(" aSet is " + aSet.longString(" "));
}
public void test3() throws VisADException, RemoteException {
float[][] samples = new float[][] {
{Float.MIN_VALUE, -1124.06897f, -1047.077026f,
Float.MAX_VALUE}};
Irregular1DSet aSet =
new Irregular1DSet(RealType.getRealType("x1", null,
null),samples);
RealType x1RT = RealType.getRealType("x1");
FunctionType interFuncType =
new FunctionType(x1RT, RealType.getRealType("value", null,
null));
FlatField interField = new FlatField(interFuncType, aSet);
interField.setSamples(new float[][] {
{100.0f, 150.0f, 110.0f, 75.0f}});
System.out.println("Test 3: interField.evaluate(-2000.0f)=");
System.out.println(interField.evaluate(new Real(x1RT, -2000.0),
Data.WEIGHTED_AVERAGE,
Data.NO_ERRORS));
}
public static void main(String[] args) throws VisADException,
RemoteException {
TestIrregular1DSet aTest = new TestIrregular1DSet();
aTest.test1();
aTest.test2();
aTest.test3();
}
}
===
Sylvain Létourneau
Research Officer
National Research Council of Canada
1500 Montreal road, Build. M-50, Rm 367A
Ottawa, Ontario Canada K1A 0R6
Phone:(613) 990-1178
Fax:(613) 952-0215