Due to the current gap in continued funding from the U.S. National Science Foundation (NSF), the NSF Unidata Program Center has temporarily paused most operations. See NSF Unidata Pause in Most Operations for details.
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: