Skip to content

Commit c1b0fde

Browse files
Merge branch 'develop' into as_png
2 parents 9b7f4f1 + a9a04f0 commit c1b0fde

File tree

2 files changed

+86
-65
lines changed

2 files changed

+86
-65
lines changed

tests/run_wgrib2_netcdf4_tests.sh

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#
44
# Alyson Stahl, 4/22/24
55

6-
set -e
6+
set -ex
77

88
echo "*** Testing converting from grib to netcdf to grib"
99
# make template
@@ -36,5 +36,11 @@ ncdump -h tablenc.nc > tablenc.txt
3636
touch tablenc.txt
3737
diff -w tablenc.txt data/ref_tablenc.gdas.t12z.pgrb2.1p00.anl.75r.grib2.txt
3838

39+
echo "*** Testing nc_time"
40+
../wgrib2/wgrib2 data/gdas.t12z.pgrb2.1p00.anl.75r.grib2 -match ":UGRD:" -nc_time 20200101000000 -netcdf test_time.nc
41+
if [ `ncdump test_time.nc | grep -c "time = 1577836800,"` -ne 1 ] ; then
42+
exit 1
43+
fi
44+
3945
echo "*** SUCCESS!"
40-
exit 0
46+
exit 0

wgrib2/Netcdf_sup.c

Lines changed: 78 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ int f_nc_table(ARG1)
299299
g2nc_conv * old_nct;
300300
char *tptr;
301301
float min, max, range, ftmp;
302+
int search_lev;
302303

303304
if (mode == -1)
304305
{
@@ -533,42 +534,53 @@ wgib2_name:wgrib2_level|*:nc_name|ignore[:ignore|no|float|deflate{0-9}|[short|by
533534

534535
for (i=0; i < nc_table->nlev; i++)
535536
{
536-
search_lev: ir = strcspn(prd,"+-.0123456789");
537-
itmp = strcspn(prd,"#"); /* inline comment */
538-
if ( ir < 0 || ir >= strlen(prd) || itmp < ir )
539-
{ /* read next line */
540-
prd = fgets(input, _MAX_PATH, fl);
541-
if (prd == NULL )
537+
search_lev = 1;
538+
while (search_lev == 1) {
539+
// search_lev: ir = strcspn(prd,"+-.0123456789");
540+
ir = strcspn(prd,"+-.0123456789");
541+
itmp = strcspn(prd,"#"); /* inline comment */
542+
if ( ir < 0 || ir >= strlen(prd) || itmp < ir )
543+
{ /* read next line */
544+
prd = fgets(input, _MAX_PATH, fl);
545+
if (prd == NULL )
546+
{
547+
fprintf(stderr,"nc_table: error reading multy line $levs \n");
548+
ierr = -7;
549+
search_lev = 1;
550+
continue;
551+
}
552+
continue;
553+
}
554+
itmp = strcspn(prd,":"); /* second important fields separator before number */
555+
if (itmp <= ir )
542556
{
543-
fprintf(stderr,"nc_table: error reading multy line $levs \n");
544-
ierr = -7;
545-
break;
557+
fprintf(stderr,"nc_table: error entering $levs, check that there are $nlev values defined\n");
558+
ierr = -8;
559+
search_lev = 1;
560+
continue;
546561
}
547-
goto search_lev;
548-
}
549-
itmp = strcspn(prd,":"); /* second important fields separator before number */
550-
if (itmp <= ir )
551-
{
552-
fprintf(stderr,"nc_table: error entering $levs, check that there are $nlev values defined\n");
553-
ierr = -8;
554-
break;
555-
}
556-
prd += ir;
557-
ir = sscanf(prd,"%g",&nc_table->lv[i]);
558-
if ( ir < 1 )
559-
{
560-
fprintf(stderr,"nc_table: $levs formatted input error\n");
561-
ierr = -9;
562-
break;
563-
}
564-
ir = strcspn(prd," ,;:\n");
565-
if(ir <= strlen(prd) ) prd += ir;
566-
else
567-
{
568-
fprintf(stderr,"nc_table: $levs parsing error, do no found fields separator\n");
569-
ierr = -10;
570-
break;
562+
prd += ir;
563+
ir = sscanf(prd,"%g",&nc_table->lv[i]);
564+
if ( ir < 1 )
565+
{
566+
fprintf(stderr,"nc_table: $levs formatted input error\n");
567+
ierr = -9;
568+
search_lev = 1;
569+
continue;
570+
}
571+
ir = strcspn(prd," ,;:\n");
572+
if(ir <= strlen(prd) ) prd += ir;
573+
else
574+
{
575+
fprintf(stderr,"nc_table: $levs parsing error, do no found fields separator\n");
576+
ierr = -10;
577+
search_lev = 1;
578+
continue;
579+
}
580+
search_lev = 0;
571581
}
582+
/* end of search lev */
583+
if (ierr) break;
572584
}
573585
if ( ierr ) break;
574586
}
@@ -881,6 +893,7 @@ int f_nc_time(ARG1)
881893
const char *p;
882894
int year,month,day,hour,minute,second,dt_val,dt_conv,err_code;
883895
char dt_type[25];
896+
int skip_date;
884897

885898
if (mode == -1)
886899
{
@@ -890,54 +903,56 @@ int f_nc_time(ARG1)
890903
nc_date0_type = 0;
891904
nc_date0 = 0;
892905
nc_dt = 0;
906+
skip_date = 0;
893907

894908
sscanf(arg1,"%c",&chr);
895909

896910
p=arg1;
897911
if (chr==':')
898912
{ /* separator symbol is first, time step only, any long string*/
899913
p++;
900-
goto get_time_step;
914+
skip_date = 1;
901915
}
902916
if (strlen(p) < 14)
903917
{ /* time step only */
904-
goto get_time_step;
918+
skip_date = 1;
905919
}
906-
/* include date */
907-
nc_date0_type = 1; /*absolute */
908-
if (chr=='-')
909-
{
910-
p++;
911-
nc_date0_type = -1; /* relative*/
912-
}
913-
else if (chr == '+')
914-
{
915-
p++;
916-
}
917-
if (sscanf(p,"%4d%2d%2d%2d%2d%2d",&year,&month,&day,&hour,&minute,&second) != 6)
918-
fatal_error("nc_time: bad format of yyyymmddhhnnss value in nc_time: %s", arg1);
920+
if (skip_date == 0) {
921+
/* include date */
922+
nc_date0_type = 1; /*absolute */
923+
if (chr=='-')
924+
{
925+
p++;
926+
nc_date0_type = -1; /* relative*/
927+
}
928+
else if (chr == '+')
929+
{
930+
p++;
931+
}
932+
if (sscanf(p,"%4d%2d%2d%2d%2d%2d",&year,&month,&day,&hour,&minute,&second) != 6)
933+
fatal_error("nc_time: bad format of yyyymmddhhnnss value in nc_time: %s", arg1);
919934

920-
if(year<0 || year>9999 || month<1 || month>12 || day<1 || day>31 ||
921-
hour <0 || hour>23 || minute < 0 || minute >59 || second < 0 || second >59)
922-
fatal_error("nc_time: bad value of yyyymmddhhnnss value in nc_time: %s", arg1);
935+
if(year<0 || year>9999 || month<1 || month>12 || day<1 || day>31 ||
936+
hour <0 || hour>23 || minute < 0 || minute >59 || second < 0 || second >59)
937+
fatal_error("nc_time: bad value of yyyymmddhhnnss value in nc_time: %s", arg1);
923938

924939
#ifdef DEBUG_NC
925940
printf("nc_time: date0_type=%d date0=%d.%d.%d %d:%d:%d\n",nc_date0_type,year,month,day,hour,minute,second);
926941
#endif
927-
nc_date0 = get_unixtime(year, month, day, hour, minute, second, &err_code);
928-
if(err_code)
929-
fatal_error("nc_time: time [sec] is out of range for this OS","");
942+
nc_date0 = get_unixtime(year, month, day, hour, minute, second, &err_code);
943+
if(err_code)
944+
fatal_error("nc_time: time [sec] is out of range for this OS","");
930945

931-
p+=14;
932-
if (strlen(p) <= 1)
933-
{
934-
if (nc_date0_type > 0) return 0;
935-
fatal_error("nc_time: negative yyyymmddhhnnss (relative date) need time step in -nc_time option: %s", arg1);
946+
p+=14;
947+
if (strlen(p) <= 1)
948+
{
949+
if (nc_date0_type > 0) return 0;
950+
fatal_error("nc_time: negative yyyymmddhhnnss (relative date) need time step in -nc_time option: %s", arg1);
951+
}
952+
p++; /*pass separator symbol ':' or other*/
936953
}
937-
p++; /*pass separator symbol ':' or other*/
938-
939-
get_time_step:
940-
954+
955+
/* now for the time step */
941956
if (sscanf(p,"%d%s",&dt_val,dt_type) != 2)
942957
fatal_error("nc_time: bad time step in nc_time: %s", p);
943958

0 commit comments

Comments
 (0)