NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
Hi Bill, thanks for your fast help. The DisplayImplJ3D with a TwoDDisplayRendererJ3D is indeed a lot faster and probably satisfies my speed needs. However, though I only changed the type of display from display = new DisplayImplJ2D("display1"); to display = new DisplayImplJ3D("display1", new TwoDDisplayRendererJ3D()); my application crashs after a while with a java.lang.IndexOutOfBoundsException [...] at javax.media.j3d.J3dThread.run. Then I tried the P5_01 example with the 3D modification and set the number sample points to 10000. Same error after a while (see full error trace below). The original 2D version works fine (and slow) with 10000 samples. I think the error is somewhere in VisAD or Java3D. You find the modificated P5_01 attached. Cheers, Timo PS. Here's the output of two runs: ~/da/test/visad: java P5_01 java.lang.IndexOutOfBoundsException: Index: -1, Size: 1 at java.util.ArrayList.RangeCheck(ArrayList.java:491) at java.util.ArrayList.get(ArrayList.java:307) at javax.media.j3d.RenderBin.findOrderedCollection(RenderBin.java:3061) at javax.media.j3d.RenderBin.findEnvironmentSet(RenderBin.java:3449) at javax.media.j3d.RenderBin.insertRenderAtom(RenderBin.java:2867) at javax.media.j3d.RenderBin.processGeometryAtoms(RenderBin.java:2398) at javax.media.j3d.RenderBin.processMessages(RenderBin.java:974) at javax.media.j3d.StructureUpdateThread.doWork(StructureUpdateThread.java:83) at javax.media.j3d.J3dThread.run(J3dThread.java:256) Exception in thread "main" java.lang.OutOfMemoryError <<no stack trace available>> java.lang.NullPointerException at visad.DerivedUnit.toThis(DerivedUnit.java:718) at visad.DerivedUnit.toThis(DerivedUnit.java:659) at visad.BaseUnit.toThat(BaseUnit.java:462) at visad.BaseUnit.toThis(BaseUnit.java:376) at visad.Unit.convertTuple(Unit.java:74) at visad.FlatField.getFloats(FlatField.java:1131) at visad.ShadowFunctionOrSetType.doTransform(ShadowFunctionOrSetType.java:1333) at javax.media.j3d.J3dThread.run(J3dThread.java:256) Exception in thread "main" java.lang.OutOfMemoryError <<no stack trace available>> java.lang.NullPointerException at visad.DerivedUnit.toThis(DerivedUnit.java:718) at visad.DerivedUnit.toThis(DerivedUnit.java:659) at visad.BaseUnit.toThat(BaseUnit.java:462) at visad.BaseUnit.toThis(BaseUnit.java:376) at visad.Unit.convertTuple(Unit.java:74) at visad.FlatField.getFloats(FlatField.java:1131) at visad.ShadowFunctionOrSetType.doTransform(ShadowFunctionOrSetType.java:1333) at visad.java3d.ShadowFunctionOrSetTypeJ3D.doTransform(ShadowFunctionOrSetTypeJ3D.java:101) at visad.java3d.DefaultRendererJ3D.doTransform(DefaultRendererJ3D.java:98) at visad.java3d.RendererJ3D.doAction(RendererJ3D.java:195) at visad.DisplayImpl.doAction(DisplayImpl.java:1008) at visad.ActionImpl.run(ActionImpl.java:225) at visad.util.ThreadPool$ThreadMinnow.run(ThreadPool.java:86) Terminated -------- 2nd run: ~/da/test/visad: java P5_01 Exception in thread "main" java.lang.OutOfMemoryError <<no stack trace available>> at visad.java3d.ShadowFunctionOrSetTypeJ3D.doTransform(ShadowFunctionOrSetTypeJ3D.java:101) at visad.java3d.DefaultRendererJ3D.doTransform(DefaultRendererJ3D.java:98) at visad.java3d.RendererJ3D.doAction(RendererJ3D.java:195) at visad.DisplayImpl.doAction(DisplayImpl.java:1008) at visad.ActionImpl.run(ActionImpl.java:225) at visad.util.ThreadPool$ThreadMinnow.run(ThreadPool.java:86) Terminated ~/da/test/visad: java P5_01 Exception in thread "main" java.lang.OutOfMemoryError <<no stack trace available>> java.lang.NullPointerException at visad.DerivedUnit.toThis(DerivedUnit.java:718) at visad.DerivedUnit.toThis(DerivedUnit.java:659) at visad.BaseUnit.toThat(BaseUnit.java:462) at visad.BaseUnit.toThis(BaseUnit.java:376) at visad.Unit.convertTuple(Unit.java:74) at visad.FlatField.getFloats(FlatField.java:1131) at visad.ShadowFunctionOrSetType.doTransform(ShadowFunctionOrSetType.java:1333) at visad.java3d.ShadowFunctionOrSetTypeJ3D.doTransform(ShadowFunctionOrSetTypeJ3D.java:101) at visad.java3d.DefaultRendererJ3D.doTransform(DefaultRendererJ3D.java:98) at visad.java3d.RendererJ3D.doAction(RendererJ3D.java:195) at visad.DisplayImpl.doAction(DisplayImpl.java:1008) at visad.ActionImpl.run(ActionImpl.java:225) at visad.util.ThreadPool$ThreadMinnow.run(ThreadPool.java:86) java.lang.NullPointerException at visad.DerivedUnit.toThis(DerivedUnit.java:718) at visad.DerivedUnit.toThis(DerivedUnit.java:659) at visad.BaseUnit.toThat(BaseUnit.java:462) at visad.BaseUnit.toThis(BaseUnit.java:376) at visad.Unit.convertTuple(Unit.java:74) at visad.FlatField.getFloats(FlatField.java:1131) at visad.ShadowFunctionOrSetType.doTransform(ShadowFunctionOrSetType.jav a:1333) at visad.java3d.ShadowFunctionOrSetTypeJ3D.doTransform(ShadowFunctionOrS etTypeJ3D.java:101) at visad.java3d.DefaultRendererJ3D.doTransform(DefaultRendererJ3D.java:9 8) at visad.java3d.RendererJ3D.doAction(RendererJ3D.java:185) at visad.DisplayImpl.doAction(DisplayImpl.java:1008) at visad.ActionImpl.run(ActionImpl.java:225) at visad.util.ThreadPool$ThreadMinnow.run(ThreadPool.java:86) -- __.__________ |lmo |homas
/* VisAD Tutorial Copyright (C) 2000 Ugo Taddei */ // Import needed classes import visad.*; import visad.java2d.DisplayImplJ2D; import visad.java3d.*; import java.rmi.RemoteException; import java.awt.*; import javax.swing.*; /** VisAD Tutorial example 5_01 A simple sine curve, but this time animated. Run program with java P5_01 * */ public class P5_01{ // Declare variables // The quantities to be displayed in x- and y-axes private RealType length, amplitude; // The function amplitude = f(length) // as ( length -> amplitude ) private FunctionType func_len_amp; // Our Data values for length are represented by the set private Set lengthSet; // The Data class FlatField, which will hold data. private FlatField amp_len_ff; // The DataReference from the data to display private DataReferenceImpl amp_len_ref; // The 2D display, and its the maps private DisplayImpl display; private ScalarMap lenXMap, ampYMap, ampRGBMap; public P5_01 (String[] args) throws RemoteException, VisADException { // Create the quantities length = new RealType("length", SI.meter, null); amplitude = new RealType("amplitude", SI.meter, null); // Create the function func_len_amp = new FunctionType(length,amplitude); // Create the domain (length) set int nSamples = 10000; lengthSet = new Linear1DSet(length, -3.0, 3.0, nSamples); // Values for amplitude are in an array like float[ rangeDim ][ nSamples] float[][] ampVals = new float[1][nSamples]; // Get the lengthtime values in the domain set to help with the calculations // "flase" means we don't get a copy from the samples float[][] lenVals = lengthSet.getSamples( false ); // Create some amplitude values: for(int i=0;i<nSamples;i++){ ampVals[0][i] = (float) Math.sin( (float) lenVals[0][i] ); } // Create a FlatField // Use FlatField(FunctionType type, Set domain_set) amp_len_ff = new FlatField( func_len_amp, lengthSet); // and initialize it with the first samples array amp_len_ff.setSamples( ampVals ); // Create Display and its maps // A 2D display // display = new DisplayImplJ2D("display1"); display = new DisplayImplJ3D("display1", new TwoDDisplayRendererJ3D()); // Get display's graphics mode control draw scales GraphicsModeControl dispGMC = (GraphicsModeControl) display.getGraphicsModeControl(); dispGMC.setScaleEnable(true); // Create the ScalarMaps lenXMap = new ScalarMap( length, Display.XAxis ); ampYMap = new ScalarMap( amplitude, Display.YAxis ); ampRGBMap = new ScalarMap( amplitude, Display.RGB ); // Add maps to display display.addMap( lenXMap ); display.addMap( ampYMap ); display.addMap( ampRGBMap ); // Create a data reference and set the FlatField as our data amp_len_ref = new DataReferenceImpl("amp_len_ref"); amp_len_ref.setData( amp_len_ff ); // Add reference to display display.addReference( amp_len_ref ); // Create application window, put display into it JFrame jframe = new JFrame("VisAD Tutorial example 5_01"); jframe.getContentPane().add(display.getComponent()); // Set window size and make it visible jframe.setSize(300, 300); jframe.setVisible(true); // index to count time step int index=0; // Loop forever, changing the samples array every time while(true){ try{ // recalculate the values for(int i=0;i<nSamples;i++){ ampVals[0][i] = (float) Math.sin( lenVals[0][i] + (float) index/50); } // Update samples amp_len_ff.setSamples( ampVals ); // System.out.println("update!" + index); index++; Thread.sleep(10); } catch (InterruptedException ie){ ie.printStackTrace(); } } } public static void main(String[] args) throws RemoteException, VisADException { new P5_01(args); } } //end of Visad Tutorial Program 5_01
visad
archives: