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.
Hi Evan, > This problem is relatively simple but has been driving me nuts. I'm > using the NetCDF library in a C/C++ program to read and write data. The > NetCDF C User's Guide says NetCDF uses C row-major convention. I am > getting the opposite results. Here is an example... > > I created a small test file that looks like this: > > % ncdump an_demo_test.cdf > netcdf an_demo_test { > dimensions: > Lat = 6 ; > Lon = 12 ; > Alt = 1 ; > variables: > double PredictedReflectivity(Alt, Lat, Lon) ; > PredictedReflectivity:Units = "dBZ" ; > data: > > PredictedReflectivity = > 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, > 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, > 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, > 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, > 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, > 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71 ; > } Yes, that shows the data in row-major order, with the "Lon" index varying most rapidly. > Now, I read this file into my C++ program using (where variables are > defined accordingly): > > status = nc_open("an_demo_test.cdf", NC_NOWRITE, &nc_id); > status = nc_inq_varid(nc_id, "PredictedReflectivity", &zh_id); > status = nc_get_var_double(nc_id, rh_id, zh_arr); > > Then I see what I've got... > > for(int i=0;i<Lat;i++) > { > for(int j=0;j<Lon;j++) > { > std::cout << "img[" << i << "," << j << "] = " << > img[i+(Lat*j)] << "\n"; It looks like you have your indices reversed in the above expression, I think you should be using: img[j+(Lat*i)] because j is varying most rapidly (the row index). --Russ > } > std::cout << "\n"; > } > > kamet.engr.colostate.edu % an_demo > Dimension (Lat) read completed (ret = 0, Lat = 6)... > Dimension (Lon) read completed (ret = 0, Lon = 12)... > Variable declared: 6x12 > sizeX() = 6 > sizeY() = 12 > img[0,0] = 0 > img[0,1] = 6 > img[0,2] = 12 > img[0,3] = 18 > img[0,4] = 24 > img[0,5] = 30 > img[0,6] = 36 > img[0,7] = 42 > img[0,8] = 48 > img[0,9] = 54 > img[0,10] = 60 > img[0,11] = 66 > > img[1,0] = 1 > img[1,1] = 7 > img[1,2] = 13 > img[1,3] = 19 > img[1,4] = 25 > img[1,5] = 31 > img[1,6] = 37 > img[1,7] = 43 > img[1,8] = 49 > img[1,9] = 55 > img[1,10] = 61 > img[1,11] = 67 > > img[2,0] = 2 > img[2,1] = 8 > img[2,2] = 14 > img[2,3] = 20 > img[2,4] = 26 > img[2,5] = 32 > img[2,6] = 38 > img[2,7] = 44 > img[2,8] = 50 > img[2,9] = 56 > img[2,10] = 62 > img[2,11] = 68 > > img[3,0] = 3 > img[3,1] = 9 > img[3,2] = 15 > img[3,3] = 21 > img[3,4] = 27 > img[3,5] = 33 > img[3,6] = 39 > img[3,7] = 45 > img[3,8] = 51 > img[3,9] = 57 > img[3,10] = 63 > img[3,11] = 69 > > img[4,0] = 4 > img[4,1] = 10 > img[4,2] = 16 > img[4,3] = 22 > img[4,4] = 28 > img[4,5] = 34 > img[4,6] = 40 > img[4,7] = 46 > img[4,8] = 52 > img[4,9] = 58 > img[4,10] = 64 > img[4,11] = 70 > > img[5,0] = 5 > img[5,1] = 11 > img[5,2] = 17 > img[5,3] = 23 > img[5,4] = 29 > img[5,5] = 35 > img[5,6] = 41 > img[5,7] = 47 > img[5,8] = 53 > img[5,9] = 59 > img[5,10] = 65 > img[5,11] = 71 > > But if I switch my loop to... > > for(int i=0;i<Lon;i++) > { > for(int j=0;j<Lat;j++) > { > std::cout << "img[" << j << "," << i << "] = " << > img[j+Lon*i) << "\n"; > } > std::cout << "\n"; > } > > I get the desired result... > > kamet.engr.colostate.edu % an_demo > Dimension (Lat) read completed (ret = 0, Lat = 6)... > Dimension (Lon) read completed (ret = 0, Lon = 12)... > Variable declared: 6x12 > sizeX() = 6 > sizeY() = 12 > ret = 0 > img[0,0] = 0 > img[1,0] = 1 > img[2,0] = 2 > img[3,0] = 3 > img[4,0] = 4 > img[5,0] = 5 > > img[0,1] = 6 > img[1,1] = 7 > img[2,1] = 8 > img[3,1] = 9 > img[4,1] = 10 > img[5,1] = 11 > > img[0,2] = 12 > img[1,2] = 13 > img[2,2] = 14 > img[3,2] = 15 > img[4,2] = 16 > img[5,2] = 17 > > img[0,3] = 18 > img[1,3] = 19 > img[2,3] = 20 > img[3,3] = 21 > img[4,3] = 22 > img[5,3] = 23 > > img[0,4] = 24 > img[1,4] = 25 > img[2,4] = 26 > img[3,4] = 27 > img[4,4] = 28 > img[5,4] = 29 > > img[0,5] = 30 > img[1,5] = 31 > img[2,5] = 32 > img[3,5] = 33 > img[4,5] = 34 > img[5,5] = 35 > > img[0,6] = 36 > img[1,6] = 37 > img[2,6] = 38 > img[3,6] = 39 > img[4,6] = 40 > img[5,6] = 41 > > img[0,7] = 42 > img[1,7] = 43 > img[2,7] = 44 > img[3,7] = 45 > img[4,7] = 46 > img[5,7] = 47 > > img[0,8] = 48 > img[1,8] = 49 > img[2,8] = 50 > img[3,8] = 51 > img[4,8] = 52 > img[5,8] = 53 > > img[0,9] = 54 > img[1,9] = 55 > img[2,9] = 56 > img[3,9] = 57 > img[4,9] = 58 > img[5,9] = 59 > > img[0,10] = 60 > img[1,10] = 61 > img[2,10] = 62 > img[3,10] = 63 > img[4,10] = 64 > img[5,10] = 65 > > img[0,11] = 66 > img[1,11] = 67 > img[2,11] = 68 > img[3,11] = 69 > img[4,11] = 70 > img[5,11] = 71 > > It looks like the NetCDF file is being read into a column-major > variable. Can you help me figure this out??? > > Many thanks, > Evan > > Russ Rew UCAR Unidata Program address@hidden http://www.unidata.ucar.edu Ticket Details =================== Ticket ID: YAR-472810 Department: Support netCDF Priority: High Status: Closed