FlatField changes, Animation length does not


We have a FlatField which maps (time -> (lat, lon, ...)
which we are animating. Lets say the length of the domain set is 6.

Subsequently the FlatField is changed by deleting some times from the domain
set, as well as the corresponding range values. Lets say that the new length of
the domain set is 4.

The animation control continues to display a domain set length of 6 (though only
4 timesteps are displayed).

How do we force the animation control to notice the change in the domain set
(which I assume also will change the labelling of the display)?

I can illustrate this problem by adding the following 3 lines to Test03.java

    // jk
    FieldImpl[] new_images = {image_sequence, image_sequence};
            // both domain sets have length 4, previously one was 4 and the
other 6
    Tuple new_big_tuple = new Tuple(new_images);

Modified code for Test03.java follows.

Thanks in advance,


VisAD system for interactive analysis and visualization of numerical
data.  Copyright (C) 1996 - 2000 Bill Hibbard, Curtis Rueden, Tom
Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and
Tommy Jasmin.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
Library General Public License for more details.

You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA

import java.awt.Component;

import java.rmi.RemoteException;

import visad.*;

import visad.java3d.DisplayImplJ3D;
import visad.util.AnimationWidget;

public class Test03
  extends UISkeleton
  public Test03() { }

  public Test03(String[] args)
    throws RemoteException, VisADException

  DisplayImpl[] setupServerDisplays()
    throws RemoteException, VisADException
    DisplayImpl[] dpys = new DisplayImpl[1];
    dpys[0] = new DisplayImplJ3D("display", DisplayImplJ3D.APPLETFRAME);
    return dpys;

  void setupServerData(LocalDisplay[] dpys)
    throws RemoteException, VisADException
    RealType[] time = {RealType.Time};
    RealType[] types = {RealType.Latitude, RealType.Longitude};
    RealTupleType earth_location = new RealTupleType(types);
    RealType vis_radiance = new RealType("vis_radiance", null, null);
    RealType ir_radiance = new RealType("ir_radiance", null, null);
    RealType[] types2 = {vis_radiance, ir_radiance};
    RealTupleType radiance = new RealTupleType(types2);
    FunctionType image_tuple = new FunctionType(earth_location, radiance);
    RealType[] types4 = {ir_radiance, vis_radiance};
    RealTupleType ecnaidar = new RealTupleType(types4);
    FunctionType image_bumble = new FunctionType(earth_location, ecnaidar);
    RealTupleType time_type = new RealTupleType(time);
    FunctionType time_images = new FunctionType(time_type, image_tuple);
    FunctionType time_bee = new FunctionType(time_type, image_bumble);

    int size = 64;
    FlatField imaget1 = FlatField.makeField(image_tuple, size, false);
    FlatField wasp = FlatField.makeField(image_bumble, size, false);

    int ntimes1 = 4;
    int ntimes2 = 6;

    // different time resolution test
    // 2 May 99, 15:51:00
    double start = new DateTime(1999, 122, 57060).getValue();
    Set time_set
      new Linear1DSet(time_type, start, start + 3000.0, ntimes1);
    double[][] times
      {{start, start + 600.0, start + 1200.0,
        start + 1800.0, start + 2400.0, start + 3000.0}};
    Set time_hornet = new Gridded1DDoubleSet(time_type, times, 6);

    FieldImpl image_sequence = new FieldImpl(time_images, time_set);
    FieldImpl image_stinger = new FieldImpl(time_bee, time_hornet);
    FlatField temp = imaget1;
    FlatField tempw = wasp;
    Real[] reals = {new Real(vis_radiance, (float) size / 4.0f),
                    new Real(ir_radiance, (float) size / 8.0f)};
    RealTuple val = new RealTuple(reals);
    for (int i=0; i<ntimes1; i++) {
      image_sequence.setSample(i, temp);
      temp = (FlatField) temp.add(val);
    for (int i=0; i<ntimes2; i++) {
      image_stinger.setSample(i, tempw);
      tempw = (FlatField) tempw.add(val);
    FieldImpl[] images = {image_sequence, image_stinger};
    Tuple big_tuple = new Tuple(images);

    dpys[0].addMap(new ScalarMap(RealType.Latitude, Display.YAxis));
    dpys[0].addMap(new ScalarMap(RealType.Longitude, Display.XAxis));
    dpys[0].addMap(new ScalarMap(vis_radiance, Display.ZAxis));
    dpys[0].addMap(new ScalarMap(ir_radiance, Display.Green));
    dpys[0].addMap(new ConstantMap(0.5, Display.Blue));
    dpys[0].addMap(new ConstantMap(0.5, Display.Red));
    ScalarMap map1animation
      new ScalarMap(RealType.Time, Display.Animation);

    DataReferenceImpl ref_big_tuple
      new DataReferenceImpl("ref_big_tuple");
    dpys[0].addReference(ref_big_tuple, null);

    // jk
    FieldImpl[] new_images = {image_sequence, image_sequence};
    Tuple new_big_tuple = new Tuple(new_images);


  String getFrameTitle() { return "VisAD animation controls"; }

  Component getSpecialComponent(LocalDisplay[] dpys)
    throws RemoteException, VisADException
    ScalarMap map1animation = (ScalarMap )dpys[0].getMapVector().lastElement();
    return new AnimationWidget(map1animation, 3000);

  public String toString()
    return ": Animation different time resolutions and AnimationWidget";

  public static void main(String[] args)
    throws RemoteException, VisADException
    new Test03(args);

James Kelly
Regional Computing and Distributed Systems        Bureau of Meteorology
PO Box 1289K                                  Melbourne 3001, Australia
Phone: 61-3-9669-4724 Fax: 61-3-9669-4128     Email: J.Kelly@xxxxxxxxxx