NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
Good morning, I am using the NetCDF library and the C interface to write and modify variables in an exsisting NetCDF file; specifically, I am addidng a single date value as relative (or absolute according to the use) to some files that were generated without a date (0000-00-00). I need them to have a date specified in order to make operations on them using CDO or NCL. I can perfectly write the missign date and have a new file with the date as I want it, but the position of the value is put is at the very end of the file by default. Is there a way to control the position inside the file where the variable value is added? I need to put it in a certain position because when I use CDO to merge several files, the output merged file does not have a date anymore. I hope I explained the problem well, if not, please contact me Kind regards Simone. Here the code in C that opens and modify an exsisting *.nc file /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// C Code that uses the NetCDF library for entering and modifying the files: /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include<stdio.h> #include<stdlib.h> #include<string.h> #include<netcdf.h> main(int argc, char *argv[]) { const char *fileANDpath[128]; int status; //Error status int ncid; //NetCDF ID int time_dim; //Dimension ID int time_id; //Variable ID int time_dimids[0]; //Variable shape int ndims, nvars, ngatts, unlimdimid; //Existing variables characteristics static char time_att1[] = "day as %Y%m%d.%f"; // static char time_att1[] = "days since "; char *s2; strcat(time_att1,s2); static size_t time_index[] = {0,0}; //Value starting from the reference. static double time_val; //Variable "ex. 19900101" //If the number fo raguments is at least 1, then the program will execute from here: /****************/ /***User inputs**/ /****************/ static char time_att2[] = "gregorian"; static char time_att3[] = "time"; /****************/ /*END Inputs*****/ /****************/ /***********************************************************/ /*Preliminary computations to prepare some strings**********/ /***********************************************************/ //Take the terminal input of the path and file name *fileANDpath = argv[2]; printf("\n - PATH = %s\n", *fileANDpath); //Take the second input from the executable: argv[2] s2 = argv[2]; strcat(time_att1, s2); //Open dataset to access it in read-only (putting 0 instead of NC_WRITE) or read-write mode: status = nc_open(*fileANDpath, NC_WRITE, &ncid); if(status != NC_NOERR) printf("Error in Opening file\n"); else printf("\nOK - File open with ID: %d\n", ncid); status = nc_inq(ncid, &ndims, &nvars, &ngatts, &unlimdimid); printf("\n File: %s\n\n - ID = %d\n - ndims = %d\n - nvars = %d\n - ngatts = %d\n - unlimdimid = %d\n\n", *fileANDpath, ncid, ndims, nvars, ngatts, unlimdimid); //Put the dataset in define mode to add dimensions, variables or attributes: status = nc_redef(ncid); if(status != NC_NOERR) printf("Error in Opening file\n"); else printf("OK - File in define mode now\n"); //Define dimensions, variables, attributes //A) Define dimensions for the "time" variable: status = nc_def_dim(ncid, "time", NC_UNLIMITED, &time_dim); //B) Define variable: time_dimids[0] = time_dim; status = nc_def_var(ncid, "time", NC_DOUBLE, 1, time_dimids, &time_id); //C) Define Attributes: status = nc_put_att_text(ncid, time_id, "units", strlen(time_att1),time_att1); status = nc_put_att_text(ncid, time_id, "calendar", strlen(time_att2), time_att2); status = nc_put_att_text(ncid, time_id, "long_name", strlen(time_att3) , time_att3); //D)Leave define mode, checking consistency of additions: status = nc_enddef(ncid); if(status != NC_NOERR) printf("Error in creating the variable\n"); else printf("OK - Variable created\n"); //E) Write a single data value: nc_put_var1_type: argv[1] time_val = atof(argv[1]); status = nc_put_var1_double(ncid, time_id, time_index, &time_val); if(status != NC_NOERR) printf("Error in nc_put_var1_type the variable\n"); else{ printf("OK - Value Added to the file\n"); printf("time_value = %.0f\n",time_val); } //Close the file and write it: status = nc_close(ncid); //Call the bash and view the file created: // system("ncdump /home/smarras/Documents/climateData/GISSdata/PROVA_ncmodifyFiles/decade_1980.ij.nc > ncdump_output"); // system("pico ncdump_output"); return 0; } -- Simone Marras, Ph.D. Student BSC & Universitat Politecnica de Catalunya Jordi Jirona 29 08034 Barcelona Spain -- Simone Marras, Ph.D. Student BSC & Universitat Politecnica de Catalunya Jordi Jirona 29 08034 Barcelona Spain ============================================================================== To unsubscribe netcdfgroup, visit: http://www.unidata.ucar.edu/mailing-list-delete-form.html ==============================================================================
netcdfgroup
archives: