ajdawson / windspharm

A Python library for spherical harmonic computations on vector winds.
http://ajdawson.github.io/windspharm
MIT License
82 stars 36 forks source link

ValueError: invalid input dimensions #85

Closed winash12 closed 7 years ago

winash12 commented 7 years ago

I am getting this error when I use the latest version of windspharm -

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/windspharm-1.5.1-py3.5.egg/windspharm/standard.py", line 105, in __init__
    rsphere=rsphere)
  File "/usr/local/lib/python3.5/dist-packages/spharm/spharm.py", line 220, in __init__
    raise ValueError(msg)
ValueError: Spharmt.__init__ illegal value of nlat (1) - must be at least 3

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "velocity_stream.py", line 52, in <module>
    w = VectorWind(uwnd, vwnd)
  File "/usr/local/lib/python3.5/dist-packages/windspharm-1.5.1-py3.5.egg/windspharm/standard.py", line 111, in __init__
    raise ValueError(err)
ValueError: invalid input dimensions

This is the shape of u wind and v wind - (1, 181, 360) (1, 181, 360)

and this is my source code - sorry I am a newbie just starting off today

nc_f1 = './u-component_of_wind_isobaric_100_2006_16_1_18Z.nc'  # Your filename
nc_f2 = './v-component_of_wind_isobaric_100_2006_16_1_18Z.nc'  # Your filename
nc_fid1 = Dataset(nc_f1,'r')
nc_fid2 = Dataset(nc_f2,'r')

lats = nc_fid1.variables['lat'][:]  # extract/copy the data
lons = nc_fid1.variables['lon'][:]

uwnd = nc_fid1.variables['u-component_of_wind_isobaric'][:]
vwnd = nc_fid2.variables['v-component_of_wind_isobaric'][:]

# The standard interface requires that latitude and longitude be the leading
# dimensions of the input wind components, and that wind components must be
# either 2D or 3D arrays. The data read in is 3D and has latitude and
# longitude as the last dimensions. The bundled tools can make the process of
# re-shaping the data a lot easier to manage.
uwnd, uwnd_info = prep_data(uwnd, 'tyx')
vwnd, vwnd_info = prep_data(vwnd, 'tyx')

# It is also required that the latitude dimension is north-to-south. Again the
# bundled tools make this easy.
lats, uwnd, vwnd = order_latdim(lats, uwnd, vwnd)
print(lats.shape,uwnd.shape,vwnd.shape)

# Create a VectorWind instance to handle the computation of streamfunction and
# velocity potential.
w = VectorWind(uwnd, vwnd)
sys.exit()
ajdawson commented 7 years ago

You get this error when you input arrays of the wrong shape. I notice most of the code is copied from one of the windspharm examples, but it is possible you do not need all the steps used in the example.

You said shape of uwnd and vwnd is (1, 181, 360), but you didn't say if that was before or after you used prep_data. Please print the shape of uwnd and vwnd immediately after they are loaded and let me know what the results is:

...
uwnd = nc_fid1.variables['u-component_of_wind_isobaric'][:]
vwnd = nc_fid2.variables['v-component_of_wind_isobaric'][:]
print(uwnd.shape)
print(vwnd.shape)
...
winash12 commented 7 years ago

The shape after they are loaded is (1,1,181,360).

This is just my very first windspharm example. So once I get a working example I will be able to modify it to my purposes and as you say most of the other stuff can be eliminated.

ajdawson commented 7 years ago

In this case you do need to use prep_data but you need to change the inputs. prep_data wants to know the order of dimensions in your array, you have told it "tyx" which represents time-latitude-longitude, but the array you pass in has 4 dimensions, probably time-pressure-latitude-longitude. You should use "tpyx" instead:

uwnd, uwnd_info = prep_data(uwnd, 'tpyx')
vwnd, vwnd_info = prep_data(vwnd, 'tpyx')
doutriaux1 commented 7 years ago

@ajdawson I just wanted to point that I think the CF conventions recommend "z" for pressure axes rather than "p", you might want to add it as a valid option to be consistent.

winash12 commented 7 years ago

Is there any reason why I cannot reshape sf and vp ?

I tried this

sf[:].squeeze()

and sf.reshape(181,360)

and when I try to print the shape of sf it is (181,360,1).

ajdawson commented 7 years ago

@ajdawson I just wanted to point that I think the CF conventions recommend "z" for pressure axes rather than "p", you might want to add it as a valid option to be consistent.

@doutriaux1 - please take a look at the documentation for prep_data, all characters except x and y are arbitrary.

ajdawson commented 7 years ago

@winash12 - reshape is not an in-place operation, you need to store the result like:

sf = sf.reshape(...)

If you want to put it back to the original shape of u and v though, that is what the windspharm.tools.recover_data function is for.

winash12 commented 7 years ago

@ajdawson - Thank you for pointing that oversight of mine and I can see two beautiful plots ! Your cooperation is most appreciated. Hopefully I can 'grow' to contribute to your codebase. Thanks again !