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.
I'm currently building a Fortran 2003 interface for Udunits 2. I'm having some trouble testing it though. I need UDUNITS to convert "days since ..." to YYYY/MM and vice versa. In my testing, I became convinced that the interface didn't work properly. But I then did some testing in C and found that I'm probably not calling UDUNITS properly in either language. Below is code to illustrate what my issue is. I've used Udunits 2 in the context of using David Pierce's calcalcs extensions of udunits 2's functionality. This involved calling ut_read_xml, ut_parse and then utCalendar2_cal. utCalendar2_cal recieves the ut_unit type variable passed from ut_parse so it knows what the referene time is. In using udunits 2 only, I call ut_read_xml, ut_parse and then ut_decode_time. The result however is relative to January 1, 2001 00:00:00. How do I make udunits2 aware of my preferred time origin? Also, is it possible to suppress the "... overrides prefixed-unit ..." warnings upon calling ut_read_xml? Chad Example code: /* gcc -Wall -Wextra -pedantic -std=c89 udunits2_demo.c -I/usr/local/udunits-2.1.21/include -L/usr/local/udunits-2.1.21/lib -ludunits2 -lexpat -lm && ./a.out */ #include <stdio.h> #include <stdlib.h> #include <udunits2.h> int main(void) { const char *units = "days since 1800-1-1 00:00:0.0"; ut_system *u_system; ut_unit *u_unit; double time; int year, month, day, hour, minute; double second, resolution; if( (u_system = ut_read_xml(NULL)) == NULL ){ fprintf(stderr, "Unable to initialize the udunits2 library!\n"); exit(EXIT_FAILURE); } if( (u_unit = ut_parse(u_system, units, UT_ASCII)) == NULL ){ fprintf(stderr, "Unable to the unit string %s!\n", units); exit(EXIT_FAILURE); } time = 18277.5; ut_decode_time(time, &year, &month, &day, &hour, &minute, &second, &resolution); fprintf(stdout, "%4d %2d %2d %2d %2d %3.1f\n", year, month, day, hour, minute, second); /* output is: 2001 1 1 5 4 37.5 should be: 1850 1 16 12 0 0.0 */ return(EXIT_SUCCESS); }
udunits
archives: