[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(&lt);
     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