This archive contains answers to questions sent to Unidata support through mid-2025. Note that the archive is no longer being updated. We provide the archive for reference; many of the answers presented here remain technically correct, even if somewhat outdated. For the most up-to-date information on the use of NSF Unidata software and data services, please consult the Software Documentation first.
>Organization: CSU >Keywords: 199503072249.AA18945 Hi Doug, > These are probably very basic questions, but I cannot seem to get them > straight... > > First, here's a bit of the header of the netCDF file I'm trying to read: > > - -=<2>=- ncdump acf94095.nc > netcdf acf94095 { > dimensions: > latitude = 3 ; > longitude = 3 ; > level = 4 ; > view = 2 ; > time = UNLIMITED ; // (21 currently) > > variables: > long Base_Time ; > Base_Time:string = "0:00:00 GMT 05 April 1994 " ; > Base_Time:long_name = "base time in epoch" ; > Base_Time:units = "seconds since 0:00:00 GMT 01 January 1970" > > ; > double Time_Offset(time) ; > Time_Offset:long_name = "time offset from base time" ; > Time_Offset:units = "seconds" ; > float Latitude(latitude) ; > Latitude:valid_range = -90.f, 90.f ; > Latitude:long_name = "north latitude" ; > Latitude:units = "degrees" ; It would be better to follow convention and name this variable "latitude" instead of "Latitude". If a variable has exactly the same name as a dimension, programs written to import netCDF data will recognize it as a coordinate variable, giving the coordinate values for the corresponding dimension. For example, "ncdump -c afc.nc" shows the names of all dimensions, variables, and attributes, and the values of coordinate variables for the file "afc.nc", if it uses this convention. Similarly, the variables Longitude, Level, and View cannot be recognized as coordinate variables unless they have exactly the same name as the corresponding dimensions. This is just a side remark, however; it is unrelated to the questions you are asking below. > float Longitude(longitude) ; > Longitude:valid_range = -180.f, 180.f ; > Longitude:long_name = "east longitude" ; > Longitude:units = "degrees" ; > float Level(level) ; > Level:valid_range = 1.f, 4.f ; > Level:long_name = "cloud level" ; > Level:units = "unitless" ; > Level:value_1 = "A value of 1. corresponds to low clouds." ; > Level:value_2 = "A value of 2. corresponds to mid clouds." ; > Level:value_3 = "A value of 3. corresponds to high clouds." ; > Level:value_4 = "A value of 4. corresponds to all clouds." ; > float View(view) ; > View:valid_range = 1.f, 2.f ; > View:long_name = "scene description" ; > View:units = "unitless" ; > View:value_1 = "A value of 1. corresponds to a clear scene." ; > View:value_2 = "A value of 2. corresponds to the total > scene." > > ; > float Cloud_Amount(time, level, latitude, longitude) ; > Cloud_Amount:valid_range = 0.f, 100.f ; > Cloud_Amount:_FillValue = -888.f ; > Cloud_Amount:missing_value = -999.f ; > Cloud_Amount:long_name = "cloud amount" ; > Cloud_Amount:units = "percent cloudy" ; > float Clear_Temperature(time, latitude, longitude) ; > Clear_Temperature:valid_range = 160.f, 330.f ; > Clear_Temperature:_FillValue = -888.f ; > Clear_Temperature:missing_value = -999.f ; > Clear_Temperature:long_name = "clear IR temperature" ; > Clear_Temperature:units = "Kelvin" ; > ... > > Now for the questions: > > When using the fortran subroutine NCVGT, my understanding is that the > variable whose hyperslab you wish to read from an existing netCDF file must > be declared in the program with arrays having the size of the dimensions (as > defined in the netCDF file) in DESCENDING order, with the unlimited > dimension being last. Yes, the FORTRAN dimension order is the opposite of the C dimension order, and the C order is what is used in CDL declarations. > Thus, I should declare Cloud_Amount as (assuming the integer size of > level,lat,lon,time have been declared in a parameter statement): > > real clamt(level,lat,lon,time) No, it should be declared with all the dimensions in the opposite order to the CDL declaration: real clamt(lon,lat,level,time) > However, both start and count correspond to the variable's dimensions (as > defined) in the netCDF file. Thus, if I want to start at the very beginning > of the hyperslab, I set > > data start /1,1,1,1/ > data count /time,level,lat,lon/ No, start is OK, but set count to correspond to the order of dimensions in the declaration: data count /lon,lat,level,time/ > Now for the next question. Since there are a total of 5 dimensions in the > netCDF file, do I have to declare ndims=5 (and start, count accordingly), > even though Cloud_Amount itself only has 4 dimensions? No, start and count only to need to be declared as large as necessary for their use in any call. In your example, declaring them to have size 4 will work fine. > Thus far, I've set > ndims=4 which seems to work, but maybe this is why I'm having the problem > explained above. Also, relating to this question, what do I do about > reading variables in the same fortran program with mixed numbers of > dimensions, in terms of setting ndims, start and count? For example, what > if I wanted to also read the hyperslab of Clear_Temperature along with that > of Cloud_Amount in the same program, but which has a different number of > dimensions from Cloud_Amount? To read Clear_Temperature, which has 3 dimensions, you can either reuse the start and count variables you have (only the first 3 values of start and count will be used in this case, so it doesn't mater what start(4) and count(4) are), or you can use different start and count arrays that are dimensioned for only 3. You might want to do the latter if you are alternately reading from a 4-dimensional and a 3-dimensional variable in a loop, because it would be easier to just update the start vector and leave the count vector constant between calls to NCVGT when getting time slices from both variables for example. > Last question: > > Below is an ncdump sample of the actual data, which I've modified slightly > to show my interpretation of the way the data in Cloud_Amount is actually > arranged. Is this correct? ... > > Latitude = 36.90999985, 36.61000061, 36.31000137 ; > > Longitude = -97.79000092, -97.48999786, -97.19000244 ; > > Level = 1, 2, 3, 4 ; > > View = 1, 2 ; > > Cloud_Amount = > l l l > a a a > t t t > 1 2 3 > > | | | _____________________________ > lon1-> 0, 0, 0, | | > lon2-> 0, 0, 0, | level 1 | > lon3-> 0, 0, 0, ________________|_ | > > 38.56999969, 84.05999756, 100, | | > 76.19000244, 100, 100, | level 2 | > 100, 100, 100, _|_ | time 1 > 61.43000031, 15.93999958, 0, | | > 23.80999947, 0, 0, | level 3 | > 0, 0, 0, _|_ | > 100, 100, 100, | | > 100, 100, 100, | level 4 | > 100, 100, 100, ________________|___________|_ > 0, 0, 0, | > 0, 0, 0, | > 0, 0, 0, | > 90.16000366, 100, 100, | > 55.74000168, 100, 100, | > 98.36000061, 100, 100, | > 9.84000015, 0, 0, | time 2 > 44.25999832, 0, 0, | > 1.63999999, 0, 0, | > 100, 100, 100, | > 100, 100, 100, | > 100, 100, 100,_____________________________|_ > > ...etc... > > Thanks very much for whatever light you can shed, No, according to your CDL declaration, time varies most slowly, then level, then latitude, then longitude varying fastest, so it looks like you've got lat and lon reversed in the above. One way to check the order is by using the "-b fortran" or "-f fortran" options to ncdump, which will show you (in comment annotations) the indices for each data value. See the ncdump man page for details. ______________________________________________________________________________ Russ Rew UCAR Unidata Program address@hidden P.O. Box 3000 http://www.unidata.ucar.edu/ Boulder, CO 80307-3000 ______________________________________________________________________________