Unidata - To provide the data services, tools, and cyberinfrastructure leadership that advance Earth system science, enhance educational opportunities, and broaden participation. Unidata
         
  advanced  
 

Re: Data manipulation

Hi Tennessee,

> I have a data manipulation question. I have a series of NetCDF files
> with the same internal structure. When loaded using InputNetcdf, they
> have the form
>
> (Time) --> ( (X, Y) --> ([variable]*))
> --------------------------
> For example
>
> (Time) --> ((x_ocean, y_ocean) --> (eta_t, hbl, sst, sss))
> --------------------------
>
> And I would like to break that up into
>
> [(Time) --> (( X, Y) --> (var))]*
> ---------------------------
> For example
>
> (Time) --> ((x_ocean, y_ocean) --> (eta_t),
> (Time) --> ((x_ocean, y_ocean) --> (hbl),
> (Time) --> ((x_ocean, y_ocean) --> (sst),
> (Time) --> ((x_ocean, y_ocean) --> (sss)
> ---------------------------
>
> i.e. factor out the variables so they each has a unique data references.
>
> The problem I'm running into is that FieldImpl has a getDomainSet() but
> no getRangeSet() - it seems like I have to get each indexed range sample
> individually getSample(n). This strikes me as being rather inefficient,
> as I will have to parse over every sample in the time array, then every
> sample in the x,y array in order to factor out the variables. The
> problem is that (a) this is computationally inefficient and (b) that I
> think it will also need to use some extra memory, which is already a
> problem for our data sets.
>
> Maybe someone could enlighten me as to a better way?

The Field method:

  Field extract(int component)

should help you do this. In:

  (Time -> ((x_ocean, y_ocean) -> (eta_t, hbl, sst, sss)))

you'll need to use getSample() to get the range Fields of Type
((x_ocean, y_ocean) -> (eta_t, hbl, sst, sss)), then 3 calls to
extract wth arguments 0, 1 and 2 will give you three Fields like:
((x_ocean, y_ocean) -> eta_t). You need to reassemble the times
sequences into Fields with Types like:

  (Time -> ((x_ocean, y_ocean) -> eta_t))

> The ultimate goal is that I want to toggle the visibility of each
> variable (i.e. temperature, salinity, U, V) independantly, which seems
> to require having separate data references for each and using
> dataReference.toggle(false).
>
> I also have some three-dimensional data which includes a z_ocean index,
> and which I may have to factor out in order to allow people to toggle
> the levels independantly.

For this, you need to call the Field method:

    Field domainFactor( RealType factor )

If you apply this to a Field with Type:

  ((x_ocean, y_ocean, z_ocean) -> eta_t)

with the factor argument = z_ocean, it should return a Field
with Type:

  (z_ocean -> ((x_ocean, y_ocean) -> eta_t))

By the way, the notation:

  (Time) --> ((x_ocean, y_ocean) --> (eta_t)

is not right. It should be:

  (Time -> ((x_ocean, y_ocean) -> eta_t))

This is what the system produces and parses.

Cheers,
Bill


 
 
  Contact Us     Site Map     Search     Terms and Conditions     Privacy Policy     Participation Policy
 
National Science Foundation (NSF) UCAR Community Programs   Unidata is a member of the UCAR Community Programs, is managed by the University Corporation for Atmospheric Research, and is sponsored by the National Science Foundation.
P.O. Box 3000     Boulder, CO 80307-3000 USA     Tel: 303-497-8643     Fax: 303-497-8690