"William L. Hibbard" wrote:
>
> Hi Doug,
>
> > 1) Any suggestions on why I am getting missing data from my resamplings?
> > The original data seem to be OK but the grid is not particularly
> > regular. (This is some MM5 output.) I defined the original domain as a
> > Gridded3DSet by giving it a list of coordinates that aren't necessarily
> > monotonically increasing. This field displays fine, but with 60*60*31
> > wind vectors, the scene is a bit crowded (and slow to rotate). My
> > resampling domain is a simple Linear3DSet (20x20x10). The result is
> > mostly OK but there are enough holes (i.e. missing data) that attempts
> > to do IsoContours are not pretty. As expected, NEAREST_NEIGHBOR doesn't
> > leave as many holes as WEIGHTED_AVERAGE, but there are still plenty.
>
> I ran some tests and believe that the cause of your missing
> points is the nature of resampling and iso-surface computation
> rather than a bug. When you resample from your Gridded3DSet to
> a Linear3DSet, any sample locations of the Linear3DSet that lie
> outside any "cubes" of the Gridded3DSet will have Field values
> set to missing. Then, the iso-surface computation will not draw
> in any "cubes" of the Linear3DSet that have a missing Field value
> at any vertex. A low-resolution Linear3DSet will have large
> "cubes", and some with corners outside the region of the original
> Gridded3DSet will extend far into it and create holes.
>
I've boiled down my problem to a simple example. The code is below. Does
your explanation above explain my results?
I am resampling along a 1D manifold in 3D space. When my original field
is defined with a Linear3DSet domain, it works. If defined by the "same"
Gridded3DSet domain, I get missing values (using WEIGHTED_AVERAGE).
NEAREST_NEIGHBOR seems to work so I'll use that for now.
Thanks,
Doug
---
import java.rmi.RemoteException;
import java.lang.Math;
import visad.*;
public class Missing
{
public static void main(String[] args)
throws Exception
{
Missing demo = new Missing();
}
public Missing()
throws Exception
{
RealType lon = new RealType("lon",null,null);
RealType lat = new RealType("lat",null,null);
RealType alt = new RealType("alt",null,null);
RealTupleType pos3d = new RealTupleType(lon,lat,alt);
RealType temp_type = new RealType("temperature", null, null);
FunctionType temp_ftype = new FunctionType(pos3d,temp_type);
RealType x = new RealType("x", null, null);
FunctionType temp2_ftype = new FunctionType(x,temp_type);
int nx = 60;
int ny = 60;
int nz = 31;
float[][] temp_coords = new float[3][nx*ny*nz];
float[][] temp_data = new float[1][nx*ny*nz];
//--- Define Data and Coordinates ---//
int icnt=0;
for (int ialt=0; ialt<nz; ialt++) {
for (int ilat=0; ilat<ny; ilat++) {
for (int ilon=0; ilon<nx; ilon++) {
//temp_data[0][icnt] = (float) (Math.sin(ilat*0.5) +
Math.sin(ilon*0.5));
temp_data[0][icnt] = 1.0f;
temp_coords[0][icnt] = 2.0f*ilon/(nx-1) - 114.0f;
temp_coords[1][icnt] = 2.0f*ilat/(ny-1) + 39.0f;
temp_coords[2][icnt] = 20000.0f*ialt/(nz-1);
icnt++;
}
}
}
//--- Two versions of the "same" set ---//
Set temp_gset = new Gridded3DSet(pos3d,temp_coords,nx,ny,nz);
Set temp_lset = new Linear3DSet(pos3d, -114.0, -112.0, nx
, 39.0, 41.0, ny
, 0.0, 20000.0, nz);
System.out.println(temp_gset.toString());
System.out.println(temp_lset.toString());
//--- Two versions of the same Field using the above domain sets
---//
FlatField templ = new FlatField(temp_ftype,temp_lset);
templ.setSamples(temp_data);
FlatField tempg = new FlatField(temp_ftype,temp_gset);
tempg.setSamples(temp_data);
//--- Define a 1D manifold in 3D space ---//
int n = 100;
FlatField temp2 = new FlatField(temp2_ftype,
new Linear1DSet(x, 0.0, 1.0*(n-1),
n));
float[][] traj_coords = new float[3][n];
for (int i=0; i<n; i++) {
traj_coords[0][i] = -112.5f - 1.0f/n*i;
traj_coords[1][i] = 40.9f - 1.0f/n*i;
traj_coords[2][i] = 5000.0f * (float) Math.sin(i*Math.PI/n);
}
Gridded3DSet traj_coord_set = new Gridded3DSet(pos3d,traj_coords,n);
//--- resample from "Linear" data, no missing values ---//
temp2.setSamples(((FlatField) templ.resample(traj_coord_set,
Data.WEIGHTED_AVERAGE,
Data.NO_ERRORS)).getValues());
System.out.println(temp2.toString());
//--- resample from "Gridded" data, missing values ---//
temp2.setSamples(((FlatField) tempg.resample(traj_coord_set,
Data.WEIGHTED_AVERAGE,
Data.NO_ERRORS)).getValues());
System.out.println(temp2.toString());
//--- resample from "Gridded" data, NEAREST_NEIGHBOR, no missing
values ---//
temp2.setSamples(((FlatField) tempg.resample(traj_coord_set,
Data.NEAREST_NEIGHBOR,
Data.NO_ERRORS)).getValues());
System.out.println(temp2.toString());
}
}