Opened 2 years ago
Closed 2 years ago
#2724 closed help (fixed)
nav_lon and nav_lat
Reported by: | charlie | Owned by: | um_support |
---|---|---|---|
Component: | Metadata | Keywords: | |
Cc: | Platform: | JASMIN | |
UM Version: | 10.7 |
Description
Hi,
Sorry to bother you with another question, but please could somebody advise on how to interpret the longitude and latitude coordinates (nav_lon and nav_lat, respectively) used to describe the curvilinear NEMO grid? I have struggled with this in the past (for other purposes) but now really need to understand how these locations are described and, in particular, how to convert the 2D latitude coordinates array into a more normal 1D list of latitudes.
As an example, see my temperature file on JASMIN at /gws/nopw/j04/ncas_climate_vol2/users/cwilliams2011/data1_for_use.d/sweet.d/gc31.d/ocean_init.d/EN4_v1.1.1995_2014.monthlymean_eORCA1T_NEMO_L75.nc
As you can see, the temperature array is 362,332 but, because the grid is curvilinear, the latitudes and longitudes are not listed as individual 1D arrays e.g. longitude = 362 values and latitude = 332 values. Instead, both are listed as coordinates in 2D arrays i.e. nav_lon = 362,332 and nav_lat = 362,332. I have taken a look in detail at both, and don't understand how these make sense.
For example, to get the latitudes, I thought I could just do print,nav_lat(0,*) i.e. just the columns of this array. But this can't be right because it gives me values ranging from -84.2107 to 50.01 - surely the latitudes should be balanced around 0 e.g. something like -89 to 89 or something similar?
The most important question is: how can I convert my 2D latitude coordinates array into a simple list of latitudes (similar to how standard grids work)?
Very many thanks,
Charlie
Attachments (1)
Change History (14)
comment:1 Changed 2 years ago by grenville
comment:2 Changed 2 years ago by charlie
Hi Grenville,
Thanks. That does help a little, inasmuch as it confirms the latitudes and longitudes. I have now looked at my file using both python (following the example above) and IDL, and according to python the latitudes do indeed start at -84 and end at 50. So at least I was reading it correctly in IDL. But how can this be? As I said in my previous message, how can the latitudes not be equal around zero?
Charlie
comment:3 Changed 2 years ago by grenville
Charlie
The lat-long coordinates of temperature(x,y) are lat(x,y) and lon(x,y)
Grenville
comment:4 Changed 2 years ago by charlie
Many thanks, and yes I understand that. What I don't understand is why the latitudes aren't equal around zero?
comment:5 Changed 2 years ago by grenville
Please put the file somewhere visible to us
comment:6 Changed 2 years ago by charlie
Sorry, I thought I had. The file is:
/gws/nopw/j04/ncas_climate_vol2/users/cwilliams2011/data1_for_use.d/sweet.d/gc31.d/ocean_init.d/EN4_v1.1.1995_2014.monthlymean_eORCA1T_NEMO_L75.nc
And it should be visible to you, is it not?
comment:7 Changed 2 years ago by grenville
I don't have access to that gws - can you put it in your home and set read permissions?
comment:8 Changed 2 years ago by charlie
Sure thing, done.
It might be that I am reading the latitudes correctly and they do indeed only go from -84 to 50, and that this is correct, given that the curvilinear grid?
Although I don't entirely understand Grenville's comment above, that the lat-long coordinates of temperature(x,y) are lat(x,y) and lon(x,y) because surely this means that each grid point e.g. temp(0,0) would have 4 coordinates, not 2?
Changed 2 years ago by grenville
comment:9 Changed 2 years ago by grenville
Charlie
temp(100,100) represents the temperature at NEMO grid point (100,100) (in NEMO units whatever they are.)
NEMO grid point (100,100) has real latitude value nav_lat(100,100) — that is one number, similarly for nav_lon
EN4_v1.1
If you xconv EN4_v1.1.1995_2014.monthlymean_eORCA1T_NEMO_L75.nc and display the nav_lon field, you'll see values from -180 to 179.99, similarly for nav_lat (values -85.789 to 89.742) - see attached
Grenville
comment:10 Changed 2 years ago by charlie
Okay, I think I'm beginning to understand - so each temperature grid point has its coordinates made up from the equivalent grid point in nav_lat and nav_lon.
It's the latitudes that I'm really interested in. I have just printed out these latitudes, i.e. the entire array nav_lat, and the reason I thought they only went up to 50 is because they are not in order i.e. they don't start at -89 and end at 89, but rather appear all jumbled up. So don't really understand how I can convert the 2D field into a 1D list of values, which are in order?
The reason I want to do this is because I need to apply an equation to my temperatures which uses the cosine of latitude i.e. something * cos(lats(y)). I have done this many times, but always within a loop using a single list of latitudes e.g. locations 0-143 corresponding to -90 to 90 whatever.
Charlie
comment:11 Changed 2 years ago by charlie
My goodness this is tricky! I thought I had solved my previous question, with some probably inelegant and inefficient code, by simply going through the array and taking the minimum value, saving that in a list, making that minimum value some other number out of range (e.g. 1000) then repeating and so on. I would then end up 332 values corresponding to the 332 latitudes, in order.
However that doesn't work, because there are more than 332 latitudes. If I just loop round 332 times, I get 332 values beginning at -85.7887 and ending at -84.5183. So nowhere near all of them. Plus surely this implies the grid points are much higher resolution than 1°, which is what I thought Nemo was? I realised then that there are, in fact, 332*362 latitudes. I thought about reading through all of them, i.e. doing the above 332*362 times, but that doesn't work either because many of these are repeated more than once. So I'm really struggling to know how to do this.
Unless I am massively over complicating this, and there's an easier way?
Charlie
comment:12 Changed 2 years ago by charlie
Hi again,
Just to let you know that I have now fixed this problem - not very elegantly, perhaps, but it works. In the end I just created my own list of 332 latitudes going from -90 to 90 (or as close to as possible), and use this in my equation. Obviously my latitudes won't match the original ones exactly, but that doesn't matter because I am simply using them to make the data array. I can then insert my new data array back into the original file, using python, so it maintains all of its original attributes, including latitude.
Thanks very much for your help with this, I'll close the ticket.
Charlie
comment:13 Changed 2 years ago by charlie
- Resolution set to fixed
- Status changed from new to closed
Charlie
Will this help - http://www.met.reading.ac.uk/~swsheaps/ncas_data_tools/pdf/cf-python_regridding.pdf (see Regridding from a tripolar grid)
Grenville