Using setDefaultSet and clone()
Don Murray
dmurray at unidata.ucar.edu
Tue Oct 3 14:09:00 MDT 2006
Hi Martin-
I've got a fix for this which will be in the next VisAD
release. If you are building VisAD from source, you can add
the following line in the FlatField.clone() method:
clone.DoubleRange = new double[TupleDimension][];
just before:
clone.packValues(unpackValues(true), false);
so it looks like:
.....
synchronized(DoubleRange) {
if (!MissingFlag) {
try {
clone.DoubleRange = new double[TupleDimension][];
clone.packValues(unpackValues(true), false);
}
catch (VisADException ex) {
throw new RuntimeException(ex.toString());
}
.....
Thanks for finding this bug!
Don
Don Murray wrote:
> Hi Martin-
>
> martin schweitzer wrote:
>
>> In an application here, we recently found that our main FlatField is
>> storing data as floats rather than doubles. At first we tried changing
>> the FlatField to a FieldImpl, however that produced problems with
>> DirectManipulationRenderer, so another approach was tried. We then
>> tried calling setDefaultSet() on our RealTypes, which worked in all
>> ways except our data cloning now appears to not give us a copy as it
>> used to.
>>
>> We were surprised that calling setDefaultSet() appears to change
>> the behaviour of FieldImpl.clone()
>
> I'm surprised too! Especially since you are calling copy = true
> on your setSamples (the default).
>
>> When we run the program below, we get a 'deep copy' when using clone.
>> If we
>> uncomment the following two lines, we get a 'shallow copy':
>>
>> // lat.setDefaultSet(new DoubleSet(lat));
>> // lon.setDefaultSet(new DoubleSet(lon));
>>
>> Any feedback or suggestions will be welcome.
>
> First, I'd suggest that instead of calling the above, you
> use the RangeSet argument of the FlatField ctor to change the
> type on the fly. That way you don't change the default set
> for lat and lon RealTypes for other uses:
>
> Field myField1 = new FlatField(func, domain, null, null, new Set[] {
> new DoubleSet(lat), new DoubleSet(lon)}, null);
>
>
> However, the problem you are seeing stems from the way the
> backing DoubleRange is not recreated as it is for the FloatRange.
> So, the two FlatFields hold the same backing store array and
> when you call setSamples on the second field, you end up modifying
> the backing store of the first since the DoubleRange is shared.
>
> I'll need others to help figure out a work around for this and
> then we'll get back to you.
>
> Don
>> Regards,
>> Martin
>>
>> Here is the program:
>>
>> import visad.*;
>>
>> public class FlatFieldTest
>> {
>> public static void main(String[] args)
>> {
>> try {
>> RealType lat = RealType.getRealType("Latitude");
>> RealType lon = RealType.getRealType("Longitude");
>> RealTupleType range = new RealTupleType(lat, lon);
>> RealType time = RealType.getRealType("time");
>> * // If the following two lines are commented out, then
>> // clone works...
>> // lat.setDefaultSet(new DoubleSet(lat));
>> // lon.setDefaultSet(new DoubleSet(lon));
>> *
>> double samples[][] = {{1, 2}};
>> Set domain = new
>> Gridded1DDoubleSet(RealType.getRealType("time"),
>> samples, 2);
>> FunctionType func = new FunctionType(time, range);
>> Field myField1 = new FlatField(func, domain);
>>
>> double[][] values = new double[2][2];
>> values[0][0] = 100;
>> values[0][1] = 200;
>> myField1.setSamples(values);
>> values[0][0] = 130;
>> values[0][1] = 180;
>>
>> Field myField2 = (FieldImpl)((FieldImpl)myField1).clone();
>> myField2.setSamples(values);
>>
>> System.out.println("ff1" + myField1);
>> System.out.println("ff1" + myField2);
>> } catch (Exception e) {
>> System.out.println(e.toString());
>> }
>> }
>> }
>>
>> *Output when the lines are commented out:*
>> ff1: FlatField
>> (time -> (Latitude, Longitude))
>> (100.0, 0.0), (200.0, 0.0)
>>
>>
>> ff2: FlatField
>> (time -> (Latitude, Longitude))
>> (130.0, 0.0), (180.0, 0.0)
>>
>> *Output when the lines are uncommented:*
>> ff1: FlatField
>> (time -> (Latitude, Longitude))
>> (130.0, 0.0), (180.0, 0.0)
>>
>>
>> ff2: FlatField
>> (time -> (Latitude, Longitude))
>> (130.0, 0.0), (180.0, 0.0)
>>
>
--
*************************************************************
Don Murray UCAR Unidata Program
dmurray at unidata.ucar.edu P.O. Box 3000
(303) 497-8628 Boulder, CO 80307
http://www.unidata.ucar.edu/staff/donm
*************************************************************
==============================================================================
To unsubscribe visad, visit:
http://www.unidata.ucar.edu/mailing-list-delete-form.html
==============================================================================
More information about the visad
mailing list