Unidata - To provide the data services, tools, and cyberinfrastructure leadership that advance Earth system science, enhance educational opportunities, and broaden participation. Unidata
         
  advanced  
 

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Add variable in a NetCDF file. Variable POSITION



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
===============================================================================


 
 
  Contact Us     Site Map     Search     Terms and Conditions     Privacy Policy     Participation Policy
 
National Science Foundation (NSF) UCAR Office of Programs University Corporation for Atmospheric Research (UCAR)   Unidata is a member of the UCAR Office of Programs, is managed by the University Corporation for Atmospheric Research, and is sponsored by the National Science Foundation.
P.O. Box 3000     Boulder, CO 80307-3000 USA     Tel: 303-497-8643     Fax: 303-497-8690