[cmor] 85/190: 2011-01-25 : path produced w/o '/' or weird characters 2011-01-25 : cannot set global attribute if it is an attribute that can be set via cmor_dataset 2011-01-25 : cannot set var attribute after var has been created into nc file 2011-01-25 : cannot set var attribute if it is settable via cmor_variable 2011-01-25 : can handle "character type" singleton dimensions 2011-01-25 : does not stores units on character typevariables 2011-01-24 : cmor_axes, interval check cleanup errormessage, now specifies which units the diff calaculated is in. 2011-01-24 : updated cmor_set_variable_attrubtes to go thru an 'internal' one
Alastair McKinstry
mckinstry at moszumanska.debian.org
Tue Jul 21 12:54:41 UTC 2015
This is an automated email from the git hooks/post-receive script.
mckinstry pushed a commit to branch debian/master
in repository cmor.
commit 76e27f80c15c2b0d9a475bbf3715b558620aaeef
Author: Charles Doutriaux <doutriaux1 at llnl.gov>
Date: Tue Jan 25 09:59:51 2011 -0800
2011-01-25 : path produced w/o '/' or weird characters
2011-01-25 : cannot set global attribute if it is an attribute that can be set via cmor_dataset
2011-01-25 : cannot set var attribute after var has been created into nc file
2011-01-25 : cannot set var attribute if it is settable via cmor_variable
2011-01-25 : can handle "character type" singleton dimensions
2011-01-25 : does not stores units on character typevariables
2011-01-24 : cmor_axes, interval check cleanup errormessage, now specifies which units the diff calaculated is in.
2011-01-24 : updated cmor_set_variable_attrubtes to go thru an 'internal' one
---
RELEASE-NOTES | 7 +
Src/cmor.c | 226 +++++++++++++++++++++-----------
Src/cmor_axes.c | 10 +-
Src/cmor_variables.c | 38 +++++-
Test/test_lots_of_variables.c | 2 +-
Test/test_lots_of_variables.f90 | 4 +-
Test/test_python_joerg_10.py | 3 +-
Test/test_shrt_exp_nm_set_att_initi.f90 | 2 +-
configure | 18 +--
configure.ac | 2 +-
include/cmor.h | 3 +-
11 files changed, 219 insertions(+), 96 deletions(-)
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 092cab8..0a2a25c 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -1,3 +1,10 @@
+2011-01-25 : path produced w/o '/' or weird characters
+2011-01-25 : cannot set global attribute if it is an attribute that can be set via cmor_dataset
+2011-01-25 : cannot set var attribute after var has been created into nc file
+2011-01-25 : cannot set var attribute if it is settable via cmor_variable
+2011-01-25 : can handle "character type" singleton dimensions
+2011-01-25 : does not stores units on character typevariables
+2011-01-24 : cmor_axes, interval check cleanup errormessage, now specifies which units the diff calaculated is in.
2011-01-24 : updated cmor_set_variable_attrubtes to go thru an 'internal' one
2010-12-17 : fixed bug found by Jamie that didn't pass the correct args in get_var_Attribute
2010-12-16 : added two python test for var with string dimensions
diff --git a/Src/cmor.c b/Src/cmor.c
index 1749eda..29f668e 100644
--- a/Src/cmor.c
+++ b/Src/cmor.c
@@ -130,14 +130,14 @@ int cmor_check_expt_id(char *expt_id, int table_id, char *gbl_lng, char *gbl_sht
strncpy(&ctmp[l-4],&expt_id[k-4],4); /* ok the sht_Exp id with the right digits */
ctmp[l]='\0';
/* Ok and now use this to reset the global attribute */
- cmor_set_cur_dataset_attribute(gbl_lng,ctmp,0);
+ cmor_set_cur_dataset_attribute_internal(gbl_lng,ctmp,0);
l=strlen(cmor_tables[table_id].sht_expt_ids[i]);
strncpy(ctmp,cmor_tables[table_id].sht_expt_ids[i],l-4);
/* but we need to replace the last 4 char from X to the actual 4 dgits */
strncpy(&ctmp[l-4],&expt_id[k-4],4); /* ok the sht_Exp id with the right digits */
ctmp[l]='\0';
/* Ok and now use this to reset the global attribute */
- cmor_set_cur_dataset_attribute(gbl_sht,ctmp,1);
+ cmor_set_cur_dataset_attribute_internal(gbl_sht,ctmp,1);
strncpy(expt_id,ctmp,CMOR_MAX_STRING);
break;
}
@@ -153,14 +153,14 @@ int cmor_check_expt_id(char *expt_id, int table_id, char *gbl_lng, char *gbl_sht
strncpy(&ctmp[l-10],&expt_id[k-10],10); /* ok the sht_Exp id with the right digits */
ctmp[l]='\0';
/* Ok and now use this to reset the global attribute */
- cmor_set_cur_dataset_attribute(gbl_lng,ctmp,0);
+ cmor_set_cur_dataset_attribute_internal(gbl_lng,ctmp,0);
l=strlen(cmor_tables[table_id].sht_expt_ids[i]);
strncpy(ctmp,cmor_tables[table_id].sht_expt_ids[i],l-4);
/* but we need to replace the last 4 char from X to the actual 4 dgits */
strncpy(&ctmp[l-10],&expt_id[k-10],10); /* ok the sht_Exp id with the right digits */
ctmp[l]='\0';
/* Ok and now use this to reset the global attribute */
- cmor_set_cur_dataset_attribute(gbl_sht,ctmp,1);
+ cmor_set_cur_dataset_attribute_internal(gbl_sht,ctmp,1);
strncpy(expt_id,ctmp,CMOR_MAX_STRING);
break;
}
@@ -169,8 +169,8 @@ int cmor_check_expt_id(char *expt_id, int table_id, char *gbl_lng, char *gbl_sht
if ((strncmp(cmor_tables[table_id].expt_ids[i],expt_id,CMOR_MAX_STRING)==0)
|| (strncmp(cmor_tables[table_id].sht_expt_ids[i],expt_id,CMOR_MAX_STRING)==0) ) {
j=1;
- cmor_set_cur_dataset_attribute(gbl_lng,cmor_tables[table_id].expt_ids[i],0);
- cmor_set_cur_dataset_attribute(gbl_sht,cmor_tables[table_id].sht_expt_ids[i],1);
+ cmor_set_cur_dataset_attribute_internal(gbl_lng,cmor_tables[table_id].expt_ids[i],0);
+ cmor_set_cur_dataset_attribute_internal(gbl_sht,cmor_tables[table_id].sht_expt_ids[i],1);
strncpy(expt_id,cmor_tables[table_id].sht_expt_ids[i],CMOR_MAX_STRING); /* make sure it is the short id */
break;
}
@@ -437,6 +437,40 @@ int cmor_convert_char_to_hyphen(char c)
return 0;
}
+void substitute_chars_with_hyphens(char *strin, char *strout, char *name, int var_id) {
+ char msg[CMOR_MAX_STRING];
+ int i;
+
+ //strncpy(strin,strout,CMOR_MAX_STRING);
+
+ for (i=0;i<strlen(strin);i++) {
+ strout[i]=strin[i];
+ if (cmor_convert_char_to_hyphen(strin[i])==1) {
+ if (var_id!=-1) {
+ snprintf(msg,CMOR_MAX_STRING,"writing variable %s (table %s), %s (%s) contains the character '%c' it will be replaced with a hyphen in the filename and output directories\n",cmor_vars[var_id].id,cmor_tables[cmor_vars[var_id].ref_table_id].table_id,name,strin,strin[i]);
+ }
+ else {
+ snprintf(msg,CMOR_MAX_STRING,"global attribute %s (%s) contains the character '%c' it will be replaced with a hyphen in output directories\n",name,strin,strin[i]);
+ }
+ cmor_handle_error(msg,CMOR_WARNING);
+ strout[i]='-';
+ }
+ }
+ strout[i]='\0';
+ /* removes trailing "-" */
+ for (i=strlen(strin)-1;i>0;i--) {
+ if (strout[i]=='-') {
+ strout[i]='\0';
+ }
+ else {
+ break;
+ }
+ }
+ return;
+}
+
+
+
void cmor_reset_variable(int var_id) {
extern cmor_var_t cmor_vars[];
int j;
@@ -836,11 +870,50 @@ int cmor_put_nc_char_attribute(int ncid,int nc_var_id,char *name,char *value,cha
}
int cmor_set_cur_dataset_attribute(char *name, char *value, int optional) {
+ char msg[CMOR_MAX_STRING];
+ cmor_add_traceback("cmor_set_cur_dataset_attribute_internal");
+ /* We need to make sure it is not an attribute that can be set via a call to cmor_dataset */
+ if (
+ (strcmp(name,"tracking_id")==0) ||
+ (strcmp(name,"product")==0) ||
+ (strcmp(name,"creation_date")==0) ||
+ (strcmp(name,"table_id")==0) ||
+ (strcmp(name,"modeling_realm")==0) ||
+ (strcmp(name,"experiment_id")==0) ||
+ (strcmp(name,"institution")==0) ||
+ (strcmp(name,"source")==0) ||
+ (strcmp(name,"calendar")==0) ||
+ (strcmp(name,"realization")==0) ||
+ (strcmp(name,"contact")==0) ||
+ (strcmp(name,"history")==0) ||
+ (strcmp(name,"comment")==0) ||
+ (strcmp(name,"references")==0) ||
+ (strcmp(name,"model_id")==0) ||
+ (strcmp(name,"forcing")==0) ||
+ (strcmp(name,"initialization_method")==0) ||
+ (strcmp(name,"physics_version")==0) ||
+ (strcmp(name,"insitute_id")==0) ||
+ (strcmp(name,"parent_experiment_id")==0) ||
+ (strcmp(name,"branch_time")==0) ||
+ (strcmp(name,"parent_experiment_rip")==0) ||
+ (strcmp(name,"parent_experiment")==0)
+ ) {
+ snprintf(msg,CMOR_MAX_STRING,"you are trying to set dataset attribute: %s this must be set via a call to cmor_dataset or is set internally by CMOR via the tables",name);
+ cmor_handle_error(msg,CMOR_NORMAL);
+ cmor_pop_traceback();
+ return 1;
+ }
+ cmor_pop_traceback();
+ return cmor_set_cur_dataset_attribute_internal(name,value,optional);
+}
+int cmor_set_cur_dataset_attribute_internal(char *name, char *value, int optional) {
int i,n;
char msg[CMOR_MAX_STRING];
extern cmor_dataset_def cmor_current_dataset;
- cmor_add_traceback("cmor_set_cur_dataset_attribute");
+ cmor_add_traceback("cmor_set_cur_dataset_attribute_internal");
cmor_is_setup();
+
+
cmor_trim_string(value,msg);
if ((int)strlen(name)>CMOR_MAX_STRING) {
snprintf(msg,CMOR_MAX_STRING,"CMOR Dataset error, attribute name: %s; length (%i) is greater than limit: %i", name, (int)strlen(name),CMOR_MAX_STRING);
@@ -1070,7 +1143,7 @@ int cmor_dataset(char *outpath,
cmor_add_traceback("cmor_dataset");
cmor_is_setup();
strncpytrim(cmor_current_dataset.outpath,outpath,CMOR_MAX_STRING);
- cmor_set_cur_dataset_attribute("institution",institution,0);
+ cmor_set_cur_dataset_attribute_internal("institution",institution,0);
/* Very first thing is to make sure the output path does exist */
if (stat(cmor_current_dataset.outpath,&buf)==0) {
@@ -1133,17 +1206,17 @@ int cmor_dataset(char *outpath,
else {
strcpy(msg,"not specified");
}
- cmor_set_cur_dataset_attribute("institute_id",msg,1);
+ cmor_set_cur_dataset_attribute_internal("institute_id",msg,1);
- cmor_set_cur_dataset_attribute("experiment_id",experiment_id,1);
+ cmor_set_cur_dataset_attribute_internal("experiment_id",experiment_id,1);
/* ok we need to check it is a valid experiment have to do it at cmor_write time though*/
- cmor_set_cur_dataset_attribute("source",source,0);
- cmor_set_cur_dataset_attribute("calendar",calendar,0);
- cmor_set_cur_dataset_attribute("model_id",model_id,1);
- cmor_set_cur_dataset_attribute("forcing",forcing,1);
- cmor_set_cur_dataset_attribute("parent_experiment_id",parent_experiment_id,1);
- cmor_set_cur_dataset_attribute("parent_experiment_rip",parent_experiment_rip,1);
+ cmor_set_cur_dataset_attribute_internal("source",source,0);
+ cmor_set_cur_dataset_attribute_internal("calendar",calendar,0);
+ cmor_set_cur_dataset_attribute_internal("model_id",model_id,1);
+ cmor_set_cur_dataset_attribute_internal("forcing",forcing,1);
+ cmor_set_cur_dataset_attribute_internal("parent_experiment_id",parent_experiment_id,1);
+ cmor_set_cur_dataset_attribute_internal("parent_experiment_rip",parent_experiment_rip,1);
if (branch_time == NULL) {
if (cmor_is_required_global_attribute("branch_time",CMOR_TABLE)==0) {
sprintf(msg,"You did not provide required attribute: branch_time");
@@ -1152,7 +1225,7 @@ int cmor_dataset(char *outpath,
}
else {
sprintf(msg,"%lf",*branch_time);
- cmor_set_cur_dataset_attribute("branch_time",msg,1);
+ cmor_set_cur_dataset_attribute_internal("branch_time",msg,1);
}
/* check if calendar is actually valid! */
@@ -1217,10 +1290,10 @@ int cmor_dataset(char *outpath,
snprintf(msg,CMOR_MAX_STRING,"Unknown calendar: %s (calendar are case sensitive)", calendar);
cmor_handle_error(msg,CMOR_CRITICAL);
}
- cmor_set_cur_dataset_attribute("contact",contact,1);
- cmor_set_cur_dataset_attribute("history",history,1);
- cmor_set_cur_dataset_attribute("comment",comment,1);
- cmor_set_cur_dataset_attribute("references",references,1);
+ cmor_set_cur_dataset_attribute_internal("contact",contact,1);
+ cmor_set_cur_dataset_attribute_internal("history",history,1);
+ cmor_set_cur_dataset_attribute_internal("comment",comment,1);
+ cmor_set_cur_dataset_attribute_internal("references",references,1);
if (realization < 0) {
snprintf(msg,CMOR_MAX_STRING,"Error realization number is negative, expected a positive number or 0 (i.e. ignored)");
cmor_handle_error(msg,CMOR_CRITICAL);
@@ -1232,21 +1305,21 @@ int cmor_dataset(char *outpath,
}
if (initialization_method>0) {
sprintf(msg,"%i",initialization_method);
- cmor_set_cur_dataset_attribute("initialization_method",msg,0);
+ cmor_set_cur_dataset_attribute_internal("initialization_method",msg,0);
}
else {
- cmor_set_cur_dataset_attribute("initialization_method","1",0);
+ cmor_set_cur_dataset_attribute_internal("initialization_method","1",0);
}
if (physics_version>0) {
sprintf(msg,"%i",physics_version);
- cmor_set_cur_dataset_attribute("physics_version",msg,0);
+ cmor_set_cur_dataset_attribute_internal("physics_version",msg,0);
}
else {
- cmor_set_cur_dataset_attribute("physics_version","1",0);
+ cmor_set_cur_dataset_attribute_internal("physics_version","1",0);
}
cmor_current_dataset.initiated=1;
- cmor_set_cur_dataset_attribute("tracking_id",cmor_current_dataset.tracking_id,0);
+ cmor_set_cur_dataset_attribute_internal("tracking_id",cmor_current_dataset.tracking_id,0);
cmor_pop_traceback();
return 0;
}
@@ -1751,7 +1824,7 @@ int cmor_write(int var_id,void *data, char type, char *suffix, int ntimes_passed
/* need to store the prodcut type */
strncpy(ctmp2,cmor_tables[cmor_vars[var_id].ref_table_id].product,CMOR_MAX_STRING);
- cmor_set_cur_dataset_attribute("product",ctmp2,1);
+ cmor_set_cur_dataset_attribute_internal("product",ctmp2,1);
/* we will need the expt_id for the filename so we check its validity here */
cmor_get_cur_dataset_attribute("experiment_id",ctmp2);
@@ -1818,23 +1891,7 @@ int cmor_write(int var_id,void *data, char type, char *suffix, int ntimes_passed
strncattrim(outname,cmor_tables[cmor_vars[var_id].ref_table_id].table_id,CMOR_MAX_STRING-strlen(outname));
if ( cmor_has_cur_dataset_attribute("model_id")==0) {
cmor_get_cur_dataset_attribute("model_id",msg);
- strcpy(ctmp5,msg);
- for (i=0;i<strlen(msg);i++) {
- if (cmor_convert_char_to_hyphen(msg[i])==1) {
- snprintf(ctmp6,CMOR_MAX_STRING,"writing variable %s (table %s), model_id (%s) contains the character '%c' it will be replaced with a hyphen in the filename and output directories\n",cmor_vars[var_id].id,cmor_tables[cmor_vars[var_id].ref_table_id].table_id,msg,msg[i]);
- cmor_handle_error(ctmp6,CMOR_WARNING);
- ctmp5[i]='-';
- }
- }
- /* removes trailing "-" */
- for (i=strlen(ctmp5)-1;i>0;i--) {
- if (ctmp5[i]=='-') {
- ctmp5[i]='\0';
- }
- else {
- break;
- }
- }
+ substitute_chars_with_hyphens(msg,ctmp5,"model_id",var_id);
strncat(outname,"_",CMOR_MAX_STRING-strlen(outname));
strncat(outname,ctmp5,CMOR_MAX_STRING-strlen(outname));
}
@@ -1849,8 +1906,8 @@ int cmor_write(int var_id,void *data, char type, char *suffix, int ntimes_passed
strncat(outname,"r0i0p0",CMOR_MAX_STRING-strlen(outname) );
origRealization = cmor_current_dataset.realization;
cmor_current_dataset.realization=0;
- cmor_set_cur_dataset_attribute("physics_version","0",0);
- cmor_set_cur_dataset_attribute("initialization_method","0",0);
+ cmor_set_cur_dataset_attribute_internal("physics_version","0",0);
+ cmor_set_cur_dataset_attribute_internal("initialization_method","0",0);
}
else {
snprintf(msg,CMOR_MAX_STRING,"r%d",cmor_current_dataset.realization);
@@ -2245,7 +2302,7 @@ int cmor_write(int var_id,void *data, char type, char *suffix, int ntimes_passed
lt = time(NULL);
ptr = gmtime(<);
snprintf(msg,CMOR_MAX_STRING,"%.4i-%.2i-%.2iT%.2i:%.2i:%.2iZ",ptr->tm_year+1900,ptr->tm_mon+1,ptr->tm_mday,ptr->tm_hour,ptr->tm_min,ptr->tm_sec);
- cmor_set_cur_dataset_attribute("creation_date",msg,0);
+ cmor_set_cur_dataset_attribute_internal("creation_date",msg,0);
if (did_history==0) {
snprintf(ctmp,CMOR_MAX_STRING,"%s CMOR rewrote data to comply with CF standards and %s requirements.",msg,cmor_tables[cmor_vars[var_id].ref_table_id].project_id);
if (cmor_has_cur_dataset_attribute("history")==0) {
@@ -2253,17 +2310,17 @@ int cmor_write(int var_id,void *data, char type, char *suffix, int ntimes_passed
snprintf(ctmp2,CMOR_MAX_STRING,"%s %s",msg,ctmp);
strncpy(ctmp,ctmp2,CMOR_MAX_STRING);
}
- cmor_set_cur_dataset_attribute("history",ctmp,0);
+ cmor_set_cur_dataset_attribute_internal("history",ctmp,0);
did_history=1;
}
snprintf(msg,CMOR_MAX_STRING,"CF-%.1f",cmor_tables[cmor_vars[var_id].ref_table_id].cf_version);
- cmor_set_cur_dataset_attribute("Conventions",msg,0);
- cmor_set_cur_dataset_attribute("project_id",cmor_tables[cmor_vars[var_id].ref_table_id].project_id,0);
+ cmor_set_cur_dataset_attribute_internal("Conventions",msg,0);
+ cmor_set_cur_dataset_attribute_internal("project_id",cmor_tables[cmor_vars[var_id].ref_table_id].project_id,0);
snprintf(msg,CMOR_MAX_STRING,"Table %s (%s) ",cmor_tables[cmor_vars[var_id].ref_table_id].table_id,cmor_tables[cmor_vars[var_id].ref_table_id].date);
for (i=0;i<16;i++) sprintf(&ctmp[2*i],"%02x",cmor_tables[cmor_vars[var_id].ref_table_id].md5[i]);
ctmp[32]='\0';
strcat(msg,ctmp);
- cmor_set_cur_dataset_attribute("table_id",msg,0);
+ cmor_set_cur_dataset_attribute_internal("table_id",msg,0);
if ( cmor_has_cur_dataset_attribute("model_id")==0) {
cmor_get_cur_dataset_attribute("model_id",ctmp);
}
@@ -2278,11 +2335,11 @@ int cmor_write(int var_id,void *data, char type, char *suffix, int ntimes_passed
/* break; */
/* } */
/* } */
-/* cmor_set_cur_dataset_attribute("experiment_id",ctmp2,0); */
+/* cmor_set_cur_dataset_attribute_internal("experiment_id",ctmp2,0); */
snprintf(msg,CMOR_MAX_STRING,"%s model output prepared for %s %s",ctmp,cmor_tables[cmor_vars[var_id].ref_table_id].project_id,ctmp2);
- cmor_set_cur_dataset_attribute("title",msg,0);
+ cmor_set_cur_dataset_attribute_internal("title",msg,0);
/* check table cf version vs ours */
afloat = CMOR_CF_VERSION_MAJOR;
d = CMOR_CF_VERSION_MINOR;
@@ -2331,10 +2388,10 @@ int cmor_write(int var_id,void *data, char type, char *suffix, int ntimes_passed
if (tmps[0]!=0.) {
sprintf(msg,"when dataset attribute parent_experiment_id is set to N/A, branch_time must be 0., you passed: %lf, we are resetting to 0. for variable %s (table: %s)",tmps[0],cmor_vars[var_id].id,cmor_tables[cmor_vars[var_id].ref_table_id].table_id);
cmor_handle_error(msg,CMOR_WARNING);
- cmor_set_cur_dataset_attribute("branch_time","0.",1);
+ cmor_set_cur_dataset_attribute_internal("branch_time","0.",1);
}
}
- cmor_set_cur_dataset_attribute("parent_experiment","N/A",1);
+ cmor_set_cur_dataset_attribute_internal("parent_experiment","N/A",1);
}
}
@@ -2352,10 +2409,10 @@ int cmor_write(int var_id,void *data, char type, char *suffix, int ntimes_passed
/* first check if the variable itself has a realm */
if (cmor_tables[cmor_vars[var_id].ref_table_id].vars[cmor_vars[var_id].ref_var_id].realm[0]!='\0') {
- cmor_set_cur_dataset_attribute("modeling_realm",cmor_tables[cmor_vars[var_id].ref_table_id].vars[cmor_vars[var_id].ref_var_id].realm,0);
+ cmor_set_cur_dataset_attribute_internal("modeling_realm",cmor_tables[cmor_vars[var_id].ref_table_id].vars[cmor_vars[var_id].ref_var_id].realm,0);
}
else { /*ok it didn't so we're using the value from the table */
- cmor_set_cur_dataset_attribute("modeling_realm",cmor_tables[cmor_vars[var_id].ref_table_id].realm,0);
+ cmor_set_cur_dataset_attribute_internal("modeling_realm",cmor_tables[cmor_vars[var_id].ref_table_id].realm,0);
}
@@ -2366,7 +2423,7 @@ int cmor_write(int var_id,void *data, char type, char *suffix, int ntimes_passed
fmt = UUID_FMT_STR;
uuid_export(myuuid,fmt,&myuuid_str,&uuidlen);
strncpy(cmor_current_dataset.tracking_id,(char *)myuuid_str,CMOR_MAX_STRING);
- cmor_set_cur_dataset_attribute("tracking_id",cmor_current_dataset.tracking_id,0);
+ cmor_set_cur_dataset_attribute_internal("tracking_id",cmor_current_dataset.tracking_id,0);
free(myuuid_str);
uuid_destroy(myuuid);
@@ -2699,17 +2756,21 @@ int cmor_write(int var_id,void *data, char type, char *suffix, int ntimes_passed
}
}
else {
-/* printf("ok in the else thingy: %s\n",cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes[j]); */
- if (cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_type[j]=='c') {
- ierr = cmor_put_nc_char_attribute(ncid,nc_vars[i],cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes[j],cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_values_char[j],cmor_vars[var_id].id);
- if (ncid!=ncafid) {
- ierr = cmor_put_nc_char_attribute(ncafid,nc_vars_af[i],cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes[j],cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_values_char[j],cmor_vars[var_id].id);
- }
+ if ((cmor_tables[cmor_axes[cmor_vars[var_id].axes_ids[i]].ref_table_id].axes[cmor_axes[cmor_vars[var_id].axes_ids[i]].ref_axis_id].type=='c') && (strcmp(cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes[j],"units")==0)) {
+ /* passing we do not want the units attribute */
}
else {
- ierr = cmor_put_nc_num_attribute(ncid,nc_vars[i],cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes[j], cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_type[j], cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_values_num[j],cmor_vars[var_id].id);
- if (ncid!=ncafid) {
- ierr = cmor_put_nc_num_attribute(ncafid,nc_vars_af[i],cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes[j], cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_type[j], cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_values_num[j],cmor_vars[var_id].id);
+ if (cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_type[j]=='c') {
+ ierr = cmor_put_nc_char_attribute(ncid,nc_vars[i],cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes[j],cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_values_char[j],cmor_vars[var_id].id);
+ if (ncid!=ncafid) {
+ ierr = cmor_put_nc_char_attribute(ncafid,nc_vars_af[i],cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes[j],cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_values_char[j],cmor_vars[var_id].id);
+ }
+ }
+ else {
+ ierr = cmor_put_nc_num_attribute(ncid,nc_vars[i],cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes[j], cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_type[j], cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_values_num[j],cmor_vars[var_id].id);
+ if (ncid!=ncafid) {
+ ierr = cmor_put_nc_num_attribute(ncafid,nc_vars_af[i],cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes[j], cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_type[j], cmor_axes[cmor_vars[var_id].axes_ids[i]].attributes_values_num[j],cmor_vars[var_id].id);
+ }
}
}
}
@@ -2865,7 +2926,13 @@ int cmor_write(int var_id,void *data, char type, char *suffix, int ntimes_passed
for(i=0;i<CMOR_MAX_DIMENSIONS;i++) {
j = cmor_vars[var_id].singleton_ids[i];
if (j!=-1) {
- ierr = nc_def_var(ncid,cmor_axes[j].id,NC_DOUBLE,0,&nc_singletons[i],&nc_singletons[i]);
+ if (cmor_tables[cmor_axes[j].ref_table_id].axes[cmor_axes[j].ref_axis_id].type=='c'){
+ ierr = nc_def_dim(ncid,"strlen",strlen(cmor_tables[cmor_axes[j].ref_table_id].axes[cmor_axes[j].ref_axis_id].cvalue),&k);
+ ierr = nc_def_var(ncid,cmor_axes[j].id,NC_CHAR,1,&k,&nc_singletons[i]);
+ }
+ else {
+ ierr = nc_def_var(ncid,cmor_axes[j].id,NC_DOUBLE,0,&nc_singletons[i],&nc_singletons[i]);
+ }
if (ierr != NC_NOERR) {
snprintf(msg,CMOR_MAX_STRING,"NetCDF Error (%i: %s) defining scalar variable %s for variable %s (table: %s)",ierr,nc_strerror(ierr),cmor_axes[j].id,cmor_vars[var_id].id,cmor_tables[cmor_vars[var_id].ref_table_id].table_id);
cmor_handle_error(msg,CMOR_CRITICAL);
@@ -3173,7 +3240,12 @@ int cmor_write(int var_id,void *data, char type, char *suffix, int ntimes_passed
for(i=0;i<CMOR_MAX_DIMENSIONS;i++) {
j = cmor_vars[var_id].singleton_ids[i];
if (j!=-1) {
- ierr = nc_put_var_double(ncid,nc_singletons[i],cmor_axes[j].values);
+ if (cmor_tables[cmor_axes[j].ref_table_id].axes[cmor_axes[j].ref_axis_id].type=='c'){
+ ierr = nc_put_var_text(ncid,nc_singletons[i],cmor_tables[cmor_axes[j].ref_table_id].axes[cmor_axes[j].ref_axis_id].cvalue);
+ }
+ else {
+ ierr = nc_put_var_double(ncid,nc_singletons[i],cmor_axes[j].values);
+ }
if (ierr != NC_NOERR) {
snprintf(msg,CMOR_MAX_STRING,"NetCDF Error (%i: %s) writing scalar variable %s for variable %s (table: %s), value: %lf",ierr,nc_strerror(ierr),cmor_axes[j].id,cmor_vars[var_id].id,cmor_tables[cmor_vars[var_id].ref_table_id].table_id,cmor_axes[j].values[0]);
cmor_handle_error(msg,CMOR_CRITICAL);
@@ -3201,7 +3273,7 @@ int cmor_write(int var_id,void *data, char type, char *suffix, int ntimes_passed
fmt = UUID_FMT_STR;
uuid_export(myuuid,fmt,&myuuid_str,&uuidlen);
strncpy(cmor_current_dataset.tracking_id,(char *)myuuid_str,CMOR_MAX_STRING);
- cmor_set_cur_dataset_attribute("tracking_id",cmor_current_dataset.tracking_id,0);
+ cmor_set_cur_dataset_attribute_internal("tracking_id",cmor_current_dataset.tracking_id,0);
ierr = nc_put_att_text(ncid, NC_GLOBAL, "tracking_id",(int)uuidlen,myuuid_str);
free(myuuid_str);
@@ -3297,10 +3369,14 @@ int cmor_create_output_path(int var_id,char *outpath)
}
}
/* institute */
- cmor_get_cur_dataset_attribute("institute_id",tmp);
- if (strcmp(tmp,"not specified")==0) {
+ cmor_get_cur_dataset_attribute("institute_id",tmp2);
+ if (strcmp(tmp2,"not specified")==0) {
strcpy(tmp,"INSTITUTE_ID");
}
+ else {
+ substitute_chars_with_hyphens(tmp2, tmp, "institute_id", -1);
+ }
+
strncattrim(outpath,tmp,CMOR_MAX_STRING-strlen(outpath));
strncat(outpath,"/",CMOR_MAX_STRING-strlen(outpath));
if (createdirs==1) {
@@ -3446,7 +3522,7 @@ int cmor_create_output_path(int var_id,char *outpath)
}
}
- cmor_set_cur_dataset_attribute("frequency",tmp,1);
+ cmor_set_cur_dataset_attribute_internal("frequency",tmp,1);
/* realm */
/* first check if the variable itslef has a realm */
@@ -3486,8 +3562,8 @@ int cmor_create_output_path(int var_id,char *outpath)
if (isfixed==1) {
strncat(outpath,"r0i0p0",CMOR_MAX_STRING-strlen(outpath) );
- cmor_set_cur_dataset_attribute("physics_version","0",0);
- cmor_set_cur_dataset_attribute("initialization_method","0",0);
+ cmor_set_cur_dataset_attribute_internal("physics_version","0",0);
+ cmor_set_cur_dataset_attribute_internal("initialization_method","0",0);
}
else {
/*realization */
diff --git a/Src/cmor_axes.c b/Src/cmor_axes.c
index ca966b7..9bcbab6 100644
--- a/Src/cmor_axes.c
+++ b/Src/cmor_axes.c
@@ -1020,20 +1020,20 @@ int cmor_check_interval(int axis_id, char *interval, double *values, int nvalues
tmp = tmp/interv;
if (tmp>.2) { /* more than 20% diff issues an error */
if (isbounds==1) {
- snprintf(ctmp,CMOR_MAX_STRING,"approximate time axis interval is defined as %f seconds (%s), for value %i we got a difference (based on bounds) of %f, which is %f %% , seems too big, check your values", interv, interval, i+1, diff, tmp*100.);
+ snprintf(ctmp,CMOR_MAX_STRING,"approximate time axis interval is defined as %f seconds (%s), for value %i we got a difference (based on bounds) of %f %s, which is %f %% , seems too big, check your values", interv, interval, i+1, diff, ctmp2,tmp*100.);
}
else {
if (isbounds==1) {
- snprintf(ctmp,CMOR_MAX_STRING,"approximate time axis interval is defined as %f seconds (%s), for value %i we got a difference (based on bounds) of %f, which is %f %% , seems too big, check your values", interv, interval, i+1, diff, tmp*100.);
+ snprintf(ctmp,CMOR_MAX_STRING,"approximate time axis interval is defined as %f seconds (%s), for value %i we got a difference (based on bounds) of %f %s, which is %f %% , seems too big, check your values", interv, interval, i+1, diff, ctmp2, tmp*100.);
}
else {
- snprintf(ctmp,CMOR_MAX_STRING,"approximate time axis interval is defined as %f seconds (%s), for value %i we got a difference of %f, which is %f %% , seems too big, check your values", interv, interval, i+1, diff, tmp*100.);
+ snprintf(ctmp,CMOR_MAX_STRING,"approximate time axis interval is defined as %f seconds (%s), for value %i we got a difference of %f %s, which is %f %% , seems too big, check your values", interv, interval, i+1, diff, ctmp2, tmp*100.);
}
}
cmor_handle_error(ctmp,CMOR_CRITICAL);
}
else if (tmp>.1) { /* more than 10% diff issues a warning */
- snprintf(ctmp,CMOR_MAX_STRING,"approximate time axis interval is defined as %f seconds (%s), for value %i we got a difference of %f, which is %f %% , seems too big, check your values", interv, interval, i+1, diff, tmp*100.);
+ snprintf(ctmp,CMOR_MAX_STRING,"approximate time axis interval is defined as %f seconds (%s), for value %i we got a difference of %f %s, which is %f %% , seems too big, check your values", interv, interval, i+1, diff, ctmp2,tmp*100.);
cmor_handle_error(ctmp,CMOR_WARNING);
}
}
@@ -1329,6 +1329,7 @@ void cmor_init_axis_def(cmor_axis_def_t *axis, int table_id)
axis->requested_bounds=NULL;
axis->tolerance=1.e-3;
axis->value=1.e20;
+ axis->cvalue[0]='\0';
axis->bounds_value[0]=1.e20;
axis->bounds_value[1]=1.e20;
axis->convert_to[0]='\0';
@@ -1429,6 +1430,7 @@ int cmor_set_axis_def_att(cmor_axis_def_t *axis,char att[CMOR_MAX_STRING],char v
axis->tolerance = atof(val);
}
else if (strcmp(att,"value")==0) {
+ strncpytrim(axis->cvalue,val,CMOR_MAX_STRING);
axis->value = atof(val);
}
else if (strcmp(att,"bounds_values")==0) {
diff --git a/Src/cmor_variables.c b/Src/cmor_variables.c
index 0e64048..66051be 100644
--- a/Src/cmor_variables.c
+++ b/Src/cmor_variables.c
@@ -111,6 +111,40 @@ int cmor_set_variable_attribute_internal(int id, char *attribute_name, char type
}
int cmor_set_variable_attribute(int id, char *attribute_name, char type, void *value)
{
+ char msg[CMOR_MAX_STRING];
+ cmor_add_traceback("cmor_set_variable_attribute");
+
+ /* First of all we need to see if it is not one of the args you can set by calling cmor_variable */
+ if (
+ (strcmp(attribute_name,"units")==0) ||
+ (strcmp(attribute_name,"missing_values")==0) ||
+ (strcmp(attribute_name,"_FillValue")==0) ||
+ (strcmp(attribute_name,"standard_name")==0) ||
+ (strcmp(attribute_name,"long_name")==0) ||
+ (strcmp(attribute_name,"flag_values")==0) ||
+ (strcmp(attribute_name,"flag_meaning")==0) ||
+ (strcmp(attribute_name,"comment")==0) ||
+ (strcmp(attribute_name,"history")==0) ||
+ (strcmp(attribute_name,"original_name")==0) ||
+ (strcmp(attribute_name,"original_units")==0) ||
+ (strcmp(attribute_name,"positive")==0) ||
+ (strcmp(attribute_name,"cell_methods")==0)
+ )
+ {
+ snprintf(msg,CMOR_MAX_STRING,"variable attribute %s (vor variable %s, table %s) must be set via a call to cmor_variable or it is automaticaly set via the tables",attribute_name,cmor_vars[id].id,cmor_tables[cmor_vars[id].ref_table_id].table_id);
+ cmor_handle_error(msg,CMOR_NORMAL);
+ cmor_pop_traceback();
+ return 1;
+ }
+ /* Before setting the attribute we need to see if the variable has been initialized */
+ if (cmor_vars[id].initialized!=0) {
+ snprintf(msg,CMOR_MAX_STRING,"attribute %s on variable %s (table %s) will probably not be set as the variablehas already been created into the output NetCDF file, please place this call BEFORE any cal to cmor_write",attribute_name,cmor_vars[id].id,cmor_tables[cmor_vars[id].ref_table_id].table_id);
+ cmor_handle_error(msg,CMOR_NORMAL);
+ cmor_pop_traceback();
+ return 1;
+ }
+ cmor_pop_traceback();
+ return 0;
return cmor_set_variable_attribute_internal(id,attribute_name,type,value);
}
@@ -637,7 +671,9 @@ int cmor_variable(int *var_id, char *name, char *units, int ndims, int axes_ids[
else {
strncpy(cmor_vars[vrid].ounits,refvar.units,CMOR_MAX_STRING);
}
- cmor_set_variable_attribute_internal(vrid,"units",'c',cmor_vars[vrid].ounits);
+ if (refvar.type!='c' ) {
+ cmor_set_variable_attribute_internal(vrid,"units",'c',cmor_vars[vrid].ounits);
+ }
strncpy(cmor_vars[vrid].iunits,units,CMOR_MAX_STRING);
if ((original_name!=NULL) && (original_name[0]!='\0')) cmor_set_variable_attribute_internal(vrid,"original_name",'c',original_name);
if ((history!=NULL) && (history[0]!='\0')) cmor_set_variable_attribute_internal(vrid,"history",'c',history);
diff --git a/Test/test_lots_of_variables.c b/Test/test_lots_of_variables.c
index bfd688d..fe9c5cb 100644
--- a/Test/test_lots_of_variables.c
+++ b/Test/test_lots_of_variables.c
@@ -291,7 +291,7 @@ int main()
/* cmor_set_cur_dataset_attribute("initialization_method","3",1); */
- cmor_set_cur_dataset_attribute("physics_version","5",1);
+/* cmor_set_cur_dataset_attribute("physics_version","5",1); */
printf("Test code: ok load cmor table(s)\n");
ierr = cmor_load_table("Test/CMIP5_Amons",&tables[0]);
strcpy(id,"time");
diff --git a/Test/test_lots_of_variables.f90 b/Test/test_lots_of_variables.f90
index c39bdbf..427c81a 100644
--- a/Test/test_lots_of_variables.f90
+++ b/Test/test_lots_of_variables.f90
@@ -209,8 +209,8 @@ PROGRAM mip_contribution
forcing='TO',contact="Barry Bonds",institute_id="PCMDI",&
parent_experiment_rip="N/A",parent_experiment_id="N/A",branch_time=bt)
- error_flag = cmor_set_cur_dataset_attribute("initialization_method","4")
- error_flag = cmor_set_cur_dataset_attribute("physics_version","6")
+ !error_flag = cmor_set_cur_dataset_attribute("initialization_method","4")
+ !error_flag = cmor_set_cur_dataset_attribute("physics_version","6")
print*, 'returned from cmor_dataset'
diff --git a/Test/test_python_joerg_10.py b/Test/test_python_joerg_10.py
index 5bfb066..b1adc61 100644
--- a/Test/test_python_joerg_10.py
+++ b/Test/test_python_joerg_10.py
@@ -33,9 +33,10 @@ cmor.dataset(
model_id="GICCM1",
forcing="Ant, Nat",
institute_id="pcmdi",
+ parent_experiment_rip="r1i1p1",
parent_experiment_id="piControl",branch_time=18336.33)
-cmor.set_cur_dataset_attribute("parent_experiment_rip","r1i1p1")
+#cmor.set_cur_dataset_attribute("parent_experiment_rip","r1i1p1")
tables=[]
a = cmor.load_table("Tables/CMIP5_grids")
diff --git a/Test/test_shrt_exp_nm_set_att_initi.f90 b/Test/test_shrt_exp_nm_set_att_initi.f90
index ff5f9bc..b7828bc 100644
--- a/Test/test_shrt_exp_nm_set_att_initi.f90
+++ b/Test/test_shrt_exp_nm_set_att_initi.f90
@@ -184,7 +184,7 @@ PROGRAM mip_contribution
print*, 'returned from cmor_dataset'
- error_flag = cmor_set_cur_dataset_attribute("initialization_method","1")
+ !error_flag = cmor_set_cur_dataset_attribute("initialization_method","1")
print*, 'returned from cmor_dataset'
! Define axes for 3-d fields
diff --git a/configure b/configure
index 0184735..246702f 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61 for cmor 2.5.2.
+# Generated by GNU Autoconf 2.61 for cmor 2.5.3.
#
# Report bugs to <doutriaux1 at llnl.gov>.
#
@@ -574,8 +574,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='cmor'
PACKAGE_TARNAME='cmor'
-PACKAGE_VERSION='2.5.2'
-PACKAGE_STRING='cmor 2.5.2'
+PACKAGE_VERSION='2.5.3'
+PACKAGE_STRING='cmor 2.5.3'
PACKAGE_BUGREPORT='doutriaux1 at llnl.gov'
ac_default_prefix=/usr/local/cmor
@@ -1185,7 +1185,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures cmor 2.5.2 to adapt to many kinds of systems.
+\`configure' configures cmor 2.5.3 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1251,7 +1251,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of cmor 2.5.2:";;
+ short | recursive ) echo "Configuration of cmor 2.5.3:";;
esac
cat <<\_ACEOF
@@ -1350,7 +1350,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-cmor configure 2.5.2
+cmor configure 2.5.3
generated by GNU Autoconf 2.61
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1364,7 +1364,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by cmor $as_me 2.5.2, which was
+It was created by cmor $as_me 2.5.3, which was
generated by GNU Autoconf 2.61. Invocation command line was
$ $0 $@
@@ -4989,7 +4989,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by cmor $as_me 2.5.2, which was
+This file was extended by cmor $as_me 2.5.3, which was
generated by GNU Autoconf 2.61. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -5032,7 +5032,7 @@ Report bugs to <bug-autoconf at gnu.org>."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\
-cmor config.status 2.5.2
+cmor config.status 2.5.3
configured by $0, generated by GNU Autoconf 2.61,
with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
diff --git a/configure.ac b/configure.ac
index d69dc38..221e0c4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@ dnl -*- Autoconf -*-
dnl Process this file with autoconf to produce a configure script.
dnl AC_PREREQ(2.59)
-AC_INIT(cmor, 2.5.2, doutriaux1 at llnl.gov)
+AC_INIT(cmor, 2.5.3, doutriaux1 at llnl.gov)
GIT_TAG=`./get_git_version.sh`
diff --git a/include/cmor.h b/include/cmor.h
index 11c062e..a1719a6 100644
--- a/include/cmor.h
+++ b/include/cmor.h
@@ -3,7 +3,7 @@
#define CMOR_VERSION_MAJOR 2
#define CMOR_VERSION_MINOR 5
-#define CMOR_VERSION_PATCH 2
+#define CMOR_VERSION_PATCH 3
#define CMOR_CF_VERSION_MAJOR 1
#define CMOR_CF_VERSION_MINOR 4
@@ -106,6 +106,7 @@ typedef struct cmor_axis_def_ {
double *requested_bounds;
double tolerance;
double value;
+ char cvalue[CMOR_MAX_STRING];
double bounds_value[2];
char required[CMOR_MAX_STRING];
char formula[CMOR_MAX_STRING];
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/cmor.git
More information about the debian-science-commits
mailing list