/*
* Copyright 1998, University Corporation for Atmospheric Research
* All Rights Reserved.
* See file LICENSE for copying and redistribution conditions.
*
* $Id: VirtualReal.java,v 1.2 2006-02-13 22:30:08 curtis Exp $
*/
package visad.data.netcdf.in;
import java.io.IOException;
import ucar.netcdf.Variable;
import visad.*;
/**
* Provides support for a virtual VisAD Real.
*/
public class
VirtualReal
extends VirtualScalar
{
/**
* The range set of the scalar.
*/
private SimpleSet rangeSet;
/**
* The unit of the scalar.
*/
private final Unit unit;
/**
* The value vetter.
*/
private final Vetter vetter;
/**
* The shape of the netCDF variable.
*/
private final int[] lengths;
/**
* Constructs from a scalar type, a 1-D netCDF variable, a range set,
* a unit, and a value vetter.
*
* @param type The type of the nested scalar.
* @param var The 1-D netCDF variable.
* @param rangeSet The range set of the values.
* @param unit The unit of the values.
* @param vetter The value vetter.
*/
public
VirtualReal(RealType type, Variable var, SimpleSet rangeSet,
Unit unit, Vetter vetter)
{
super(type, var);
this.rangeSet = rangeSet;
this.unit = unit;
this.vetter = vetter;
lengths = var.getLengths();
}
/**
* Gets the range set of this scalar.
*
* @return The range set of this scalar.
*/
public SimpleSet
getRangeSet()
{
return rangeSet;
}
/**
* Gets the unit of the value.
*
* @return The unit of the value.
*/
public Unit
getUnit()
{
return unit;
}
/**
* Gets the value vetter.
*
* @return The value vetter.
*/
public Vetter
getVetter()
{
return vetter;
}
/**
* Gets the Scalar object corresponding to this virtual, data
* object.
*
* @return The VisAD Scalar corresponding to this
* virtual, data object.
* @throws InvalidContextException
* if the indicial context is invalid.
* @throws VisADException Couldn't create necessary VisAD object.
* @throws RemoteException if a Java RMI failure occurs.
* @throws IOException I/O failure.
*/
protected Scalar getScalar(Context context)
throws VisADException, InvalidContextException, IOException
{
double[] values = getDoubles(context);
if (values.length != 1)
throw new InvalidContextException(context);
return (Scalar) new Real( (RealType)getScalarType(),
values[0],
getUnit());
}
/**
* Gets the double values corresponding to this virtual, data
* object at a given context.
*
* @return The double values of this virtual, data object.
* throws VisADException Couldn't create necessary VisAD object.
* throws IOException I/O failure.
*/
public double[]
getDoubles(Context context)
throws IOException, VisADException
{
int rank = lengths.length;
int[] ioOrigin = new int[rank];
int[] ioShape = new int[rank];
int[] ioContext = context.getContext();
System.arraycopy(ioContext, 0, ioOrigin, 0, ioContext.length);
for (int i = 0; i < ioContext.length; ++i)
ioShape[i] = 1;
int total = 1;
for (int i = ioContext.length; i < rank; ++i)
{
ioOrigin[i] = 0;
ioShape[i] = lengths[i];
total *= lengths[i];
}
double[] values = new double[total];
toArray(getVariable(), values, ioOrigin, ioShape);
vetter.vet(values);
return values;
}
/**
* Determines if this is a VirtualReal or not.
*
* @return true if this is a VirtualReal
*/
public boolean
isReal()
{
return true;
}
/**
* Clones this instance.
*
* @return A (deep) clone of this instance.
*/
public Object clone()
{
return new VirtualReal((RealType)getScalarType(), getVariable(),
rangeSet, unit, vetter);
}
}